2. Creating some initial visualisations
Fires per year
year_plot <- fires_small %>%
group_by(fire_year) %>%
summarise(num_fires =n())
`summarise()` ungrouping output (override with `.groups` argument)
year_plot %>%
ggplot +
aes(x = fire_year, y = num_fires) +
geom_point() +
ylim(0, 120000)

# geom_col(fill = "dark blue", col ="white") +
# geom_smooth(method = "lm", se = FALSE, colour = "red")
There is a lot of variation in the data between years. Visually it looks like a repeating pattern is occurring every 5 years or so with 4 peaks visible within this reporting period. Having looked at the historic weather for that date range these peaks seems to coincide with recorded heatwaves in 2000, 2006 and 2011.(1)
https://en.wikipedia.org/wiki/List_of_heat_waves
model <- lm(formula = num_fires ~ fire_year, data = year_plot)
summary(model)
Call:
lm(formula = num_fires ~ fire_year, data = year_plot)
Residuals:
Min 1Q Median 3Q Max
-16835 -8688 -2049 9226 34793
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -609543.8 756667.9 -0.806 0.429
fire_year 343.3 377.7 0.909 0.373
Residual standard error: 12810 on 22 degrees of freedom
Multiple R-squared: 0.03621, Adjusted R-squared: -0.007601
F-statistic: 0.8265 on 1 and 22 DF, p-value: 0.3731
tidy(model)
clean_names(glance(model))
autoplot(model)
`arrange_()` is deprecated as of dplyr 0.7.0.
Please use `arrange()` instead.
See vignette('programming') for more help
This warning is displayed once every 8 hours.
Call `lifecycle::last_warnings()` to see where this warning was generated.

year_plot %>%
add_predictions(model) %>%
add_residuals(model)
Warning message:
In `[<-.data.frame`(`*tmp*`, is_list, value = list(`23` = "<S3: blob>")) :
replacement element 1 has 1 row to replace 0 rows
year_plot
year_plot %>%
ggplot(aes(x = fire_year)) +
geom_point(aes(y = num_fires)) +
geom_abline(
intercept = model$coefficients[1],
slope = model$coefficients[2],
col = "red"
) +
ylim(0, 120000)

NA
bootstrap <- year_plot %>%
specify(formula = num_fires ~ fire_year) %>%
generate(reps = 10000, type = "bootstrap") %>%
calculate(stat = "slope")
bootstrap %>%
visualise(bins= 30) +
shade_ci(endpoints = slope_ci95)

slope_ci95 <- bootstrap %>%
get_ci(level = 0.95, type = "percentile")
slope_ci95
NA
clean_names(tidy(model, conf.int = TRUE, conf.level = 0.95))
Fires per day
fires_small %>%
group_by(discovery_date) %>%
summarise(num_fires = n()) %>%
ggplot +
aes(x = discovery_date, y = num_fires) +
geom_line(col = "dark blue")
`summarise()` ungrouping output (override with `.groups` argument)

This shows a typical time series plot with a cyclic variation due to warmer weather in the summer time.
Fires per month
fires_small %>%
mutate(year_month = make_date(fire_year, discovery_moy)) %>%
group_by(year_month) %>%
summarise(num_fires = n()) %>%
ggplot +
aes(x = year_month, y = num_fires) +
geom_line(col = "dark blue")
`summarise()` ungrouping output (override with `.groups` argument)

Peaks are still shown to be occurring in the summer. The 2006 heatwave is especially visable.
Fires by day of year
fires_small %>%
group_by(discovery_doy) %>%
summarise(num_fires = n()) %>%
ggplot(aes(x = discovery_doy, y = num_fires)) +
geom_line(col = "dark blue")
`summarise()` ungrouping output (override with `.groups` argument)

The are peaks around day 60-110 and a big peak around 180.
Checking the data to see where the peak occurs
fires_small %>%
group_by(discovery_doy) %>%
summarise(num_fires = n()) %>%
arrange(desc(num_fires))
`summarise()` ungrouping output (override with `.groups` argument)
The 2 highest days of the year are on 185 and 186, which happens to be Independence Day (4th July) on a normal year and a leap year retrospectively. So I imagine most of the extra fires (literally over double the normal amount) are caused by fireworks.
Fires by month of year
fires_small %>%
group_by(discovery_moy) %>%
summarise(num_fires = n()) %>%
ggplot(aes(x = discovery_moy, y = num_fires)) +
geom_col(fill = "dark blue", col = "white")
`summarise()` ungrouping output (override with `.groups` argument)

There are 2 definite peaks during the year. March and April are probably due to the US “Spring Break”, where schools and Universities are stopped and so families are likely to be on vacation during that period possibly visiting National Parks. July and August is also Summer Break for school with both families visiting Parks and hot weather likely causes of fire outbreaks.
Fires by cause
options(scipen = 999)
fires_small %>%
group_by(stat_cause_descr) %>%
summarise(num_fires = n()) %>%
ggplot +
aes(reorder(x = stat_cause_descr, num_fires), y = num_fires) +
geom_col(fill = "dark blue") +
coord_flip()
`summarise()` ungrouping output (override with `.groups` argument)

Fire avg size by cause
fires_small %>%
group_by(stat_cause_descr) %>%
summarise(avg_size = mean(fire_size)) %>%
ggplot +
aes(reorder(x = stat_cause_descr, avg_size), y = avg_size) +
geom_col(fill = "dark blue") +
coord_flip()
`summarise()` ungrouping output (override with `.groups` argument)

Avg burn time by cause
fires_small %>%
summarise(num_na = sum(is.na(cont_date)))
Literally half the data is missing for burn time, making it very difficult to do any meaningful analysis
Fires by size
fires_small %>%
group_by(fire_size_class) %>%
summarise(num_fires = n()) %>%
ggplot +
aes(x = fire_size_class, y = num_fires, fill = fire_size_class) +
geom_col() +
scale_fill_manual(values = c("red", "orange", "yellow", "green", "blue",
"purple", "black"),
name = "Fire Size Classification",
breaks = c("A", "B", "C", "D", "E", "F", "G"),
labels = c("A: < 1/4 acre", "B: 1/4 to 10 acres", "C: 10 to 100 acres",
"D: 100 to 300 acres", "E: 300 to 1000 acres",
"F: 1000 to 5000 acres", "G: More than 5000 acres"))
`summarise()` ungrouping output (override with `.groups` argument)

3. Geo Spatial Visualisations
The dataset has a cause of fire column so I shall now create some causation plots.
Getting list of fire causes
fires_states %>%
distinct(stat_cause_descr) %>%
arrange(-desc(stat_cause_descr))
Wildfires caused by Arson
cause("Arson")
`summarise()` ungrouping output (override with `.groups` argument)

Arson does seem more prevalent in the SE states of Mississippi, Georgia, Alabama and also the western state of California.
Wildfires caused by Campfire
cause("Campfire")
`summarise()` ungrouping output (override with `.groups` argument)

Campfires are the most prevalent in the Western states of Oregon, California and Arizona.
Wildfires caused by Children
cause("Children")
`summarise()` ungrouping output (override with `.groups` argument)

Fires by children are spread about the country, but the most prevalent states are California in the West, Alabama and South Carolina and New Jersey in the east.
Wildfires caused by Debris Burning
cause("Debris Burning")
`summarise()` ungrouping output (override with `.groups` argument)

Fires by burning debris are mostly in the southern warmer states of Texas, Georgia and North Carolina.
Wildfires caused by Equiment Use
cause("Equipment Use")
`summarise()` ungrouping output (override with `.groups` argument)

Most of the fires caused by equipment seem to be in California
Wildfires caused by Fireworks
cause("Fireworks")
`summarise()` ungrouping output (override with `.groups` argument)

Most of the fires caused by fireworks seem to be in the north of the country. Primarily South Dakota, Montana and Washington state.
Wildfires caused by Lightning
cause("Lightning")
`summarise()` ungrouping output (override with `.groups` argument)

Apart from a hotspot of lightning strikes in Florida, the vast majority of fires caused by lightning are in the West of the country. With the 3 most affected states being California, Oregon and Arizona.
Wildfires caused by Miscellious
cause("Miscellaneous")
`summarise()` ungrouping output (override with `.groups` argument)

There seems to be quite a few miscellaneous classifications in California, Texas and New York.
Wildfires caused by Missing/Undefined
cause("Missing/Undefined")
`summarise()` ungrouping output (override with `.groups` argument)

The states with the most missing or undefined data is North and South Carolina, Oklahoma and California.
Wildfires caused by Railroad
cause("Railroad")
`summarise()` ungrouping output (override with `.groups` argument)

By far Florida has the most wildfires caused by railroads.
Wildfires caused by Smoking
cause("Smoking")
`summarise()` ungrouping output (override with `.groups` argument)

Fires caused by smoking seem to be spread around the country, but mainly on the east and west coasts.
Wildfires caused by Structure
cause("Structure")
`summarise()` ungrouping output (override with `.groups` argument)

South Dakota has the largest proportion of fires caused by structures.
Unsurprisingly the southern states seem to have more occurences of wildifre in general, no doubt due to the warmer climate at their latitudes. Also the 1st and 3rd states with the highest number of fires are also the 2 largest States by size. However the 2nd highest State is Georgia, which although it is in the South of the country is only an average sized State. Therefore to get a better picture of what is going on I’m going to look at the proportion of fires occuring by square mile by normalising the State size.
The dataset package also has the area in square miles of each state included in the state.area vector.
state.area
[1] 51609 589757 113909 53104 158693 104247 5009 2057 58560 58876
[11] 6450 83557 56400 36291 56290 82264 40395 48523 33215 10577
[21] 8257 58216 84068 47716 69686 147138 77227 110540 9304 7836
[31] 121666 49576 52586 70665 41222 69919 96981 45333 1214 31055
[41] 77047 42244 267339 84916 9609 40815 68192 24181 56154 97914
length(state.area)
[1] 50
Annoyingly it also only has 50 states not 52 so I will need to add in DC and PR back in.
(Area figures obtained from Wikipedia)
DC = 68 miles^2 PR = 3515 miles^2
# To make my life easier I'm going to remove the state.abb and .name files and make the tibble again, adding in the land area figures at the same time to make sure they are in the correct order.
rm(state.abb)
rm(state.name)
state.abb <- append(state.abb, c("DC", "PR"))
state.name <- append(state.name, c("District of Columbia", "Puerto Rico"))
state.area <- append(state.area, c("68", "3515"))
state_list <- tibble(state = state.abb, region = tolower(state.name), area = as.numeric(state.area))
# Re-joining tibbles
fires_states <- fires_small %>%
left_join(state_list, by = "state")
Normalising States area sizes
fires_states %>%
select(region, area) %>%
group_by(region, area) %>%
summarise(num_fires = n()) %>%
mutate(fires_sqmile = num_fires / area) %>%
arrange(desc(fires_sqmile))
`summarise()` regrouping output by 'region' (override with `.groups` argument)
This table shows Puerto Rico has the highest proportion of fires compared to its size, followed by New Jersey in the NE of the country and finally by the States in the SE of the country.
fires_states %>%
select(region, area) %>%
group_by(region, area) %>%
summarise(num_fires = n()) %>%
mutate(fires_sqmile = num_fires / area) %>%
right_join(state_map, by = "region") %>%
ggplot +
(aes(x = long, y = lat, group = group, fill = fires_sqmile)) +
geom_polygon() +
geom_path(color = "white") +
scale_fill_distiller(name = "Fire per Sq Mile", palette = "PuBuGn") +
theme_map() +
coord_map("mollweide") +
ggtitle(paste0("Total US Wildfires per Square Mile from 1992-2015")) +
theme(plot.title = element_text(hjust = 0.5))
`summarise()` regrouping output by 'region' (override with `.groups` argument)

Puerto Rico is not shown on this map, but visually we can see the data for the other 51 entries, and the south eastern states still have the highest proportion of wildfires. Interestingly New Jersey also shows has a hotspot in the NE of the country.
Do causes change over time?
Splitting causes into 2 group for legibility.
The first group is for directly man created fires.
fires_states %>%
select(stat_cause_descr, fire_year) %>%
group_by(fire_year, stat_cause_descr) %>%
filter(stat_cause_descr == "Arson" | stat_cause_descr == "Campfire" |
stat_cause_descr == "Children" | stat_cause_descr == "Equipment Use" |
stat_cause_descr == "Fireworks" | stat_cause_descr == "Smoking") %>%
summarise(num_fires = n()) %>%
ggplot +
aes(x = fire_year, y = num_fires, colour = stat_cause_descr) +
geom_line()
`summarise()` regrouping output by 'fire_year' (override with `.groups` argument)

The 2 large peaks in Arson are obvious in 1999 and 2006. There was a large heatwave in 2006, but I’m not sure why this would result in an increase in arson. Unless this was just due to the dry ground creating extra fuel to aid the spread of fires that would have normally not resulted in a large scale fire. This may also be the same reason that there is also another peak in 2006 for Equipment Use. Arson however does look to be decreasing since 2006.
And this one for natural occuring fires.
fires_states %>%
select(stat_cause_descr, fire_year) %>%
group_by(fire_year, stat_cause_descr) %>%
filter(stat_cause_descr == "Debris Burning" | stat_cause_descr == "Lightning" |
stat_cause_descr == "Miscellaneous" | stat_cause_descr ==
"Missing/Undefined" | stat_cause_descr == "Powerline" |
stat_cause_descr == "Railroad" | stat_cause_descr == "Structure") %>%
summarise(num_fires = n()) %>%
ggplot +
aes(x = fire_year, y = num_fires, colour = stat_cause_descr) +
geom_line()
`summarise()` regrouping output by 'fire_year' (override with `.groups` argument)

Similar peaks can be seen in Debris, Miscellaneous and lightning in the heatwave of 2006 that left the ground very dry. There are peaks from 1997 to 2003 in debris, miscellaneous and lightening, but also a trough in missing/undefined, so this is likely to be due to more accurate classification of fires and not using the missing/undefined category as much.
Difference in causes between states
state_map_southern <- state_map %>%
filter(region == "florida" | region == "georgia" | region == "alabama" |
region == "mississippi" | region == "south carolina" |
region == "north carolina" | region == "tennessee" |
region == "arkansas" | region == "louisiana")
fires_states %>%
filter(fire_year == "1992" | fire_year == "1993" | fire_year == "1994" |
fire_year == "1995") %>%
filter(region == "florida" | region == "georgia" | region == "alabama" |
region == "mississippi" | region == "south carolina" |
region == "north carolina" | region == "tennessee" |
region == "arkansas" | region == "louisiana") %>%
select(region, stat_cause_descr) %>%
group_by(region, stat_cause_descr) %>%
summarise(num_fire = n()) %>%
top_n(1) %>%
right_join(state_map_southern, by = "region") %>%
ggplot +
(aes(x = long, y = lat, group = group, fill = stat_cause_descr)) +
geom_polygon() +
geom_path(color = "white") +
theme_map() +
scale_fill_brewer(name = "Cause of Fires", palette = "PuBuGn") +
ggtitle("Total US Wildfires main cause from 1992-1995") +
theme(plot.title = element_text(hjust = 0.5))
`summarise()` regrouping output by 'region' (override with `.groups` argument)
Selecting by num_fire

ggsave("1992-1995.png")
Saving 7 x 7 in image
fires_states %>%
filter(fire_year == "1996" | fire_year == "1997" | fire_year == "1998" |
fire_year == "1999") %>%
filter(region == "florida" | region == "georgia" | region == "alabama" |
region == "mississippi" | region == "south carolina" |
region == "north carolina" | region == "tennessee" |
region == "arkansas" | region == "louisiana") %>%
select(region, stat_cause_descr) %>%
group_by(region, stat_cause_descr) %>%
summarise(num_fire = n()) %>%
top_n(1) %>%
right_join(state_map_southern, by = "region") %>%
ggplot +
(aes(x = long, y = lat, group = group, fill = stat_cause_descr)) +
geom_polygon() +
geom_path(color = "white") +
theme_map() +
scale_fill_brewer(name = "Cause of Fires", palette = "PuBuGn") +
ggtitle("Total US Wildfires main cause from 1996-1999") +
theme(plot.title = element_text(hjust = 0.5))
`summarise()` regrouping output by 'region' (override with `.groups` argument)
Selecting by num_fire

ggsave("1996-1999.png")
Saving 7 x 7 in image
fires_states %>%
filter(fire_year == "2000" | fire_year == "2001" | fire_year == "2002" |
fire_year == "2003") %>%
filter(region == "florida" | region == "georgia" | region == "alabama" |
region == "mississippi" | region == "south carolina" |
region == "north carolina" | region == "tennessee" |
region == "arkansas" | region == "louisiana") %>%
select(region, stat_cause_descr) %>%
group_by(region, stat_cause_descr) %>%
summarise(num_fire = n()) %>%
top_n(1) %>%
right_join(state_map_southern, by = "region") %>%
ggplot +
(aes(x = long, y = lat, group = group, fill = stat_cause_descr)) +
geom_polygon() +
geom_path(color = "white") +
theme_map() +
scale_fill_brewer(name = "Cause of Fires", palette = "PuBuGn") +
ggtitle("Total US Wildfires main cause from 2000-2003") +
theme(plot.title = element_text(hjust = 0.5))
`summarise()` regrouping output by 'region' (override with `.groups` argument)
Selecting by num_fire

ggsave("2000-2003.png")
Saving 7 x 7 in image
fires_states %>%
filter(fire_year == "2004" | fire_year == "2005" | fire_year == "2006" |
fire_year == "2007") %>%
filter(region == "florida" | region == "georgia" | region == "alabama" |
region == "mississippi" | region == "south carolina" |
region == "north carolina" | region == "tennessee" |
region == "arkansas" | region == "louisiana") %>%
select(region, stat_cause_descr) %>%
group_by(region, stat_cause_descr) %>%
summarise(num_fire = n()) %>%
top_n(1) %>%
right_join(state_map_southern, by = "region") %>%
ggplot +
(aes(x = long, y = lat, group = group, fill = stat_cause_descr)) +
geom_polygon() +
geom_path(color = "white") +
theme_map() +
scale_fill_brewer(name = "Cause of Fires", palette = "PuBuGn") +
ggtitle("Total US Wildfires main cause from 2004-2007") +
theme(plot.title = element_text(hjust = 0.5))
`summarise()` regrouping output by 'region' (override with `.groups` argument)
Selecting by num_fire

ggsave("2004-2007.png")
Saving 7 x 7 in image
fires_states %>%
filter(fire_year == "2008" | fire_year == "2009" | fire_year == "2010" |
fire_year == "2011") %>%
filter(region == "florida" | region == "georgia" | region == "alabama" |
region == "mississippi" | region == "south carolina" |
region == "north carolina" | region == "tennessee" |
region == "arkansas" | region == "louisiana") %>%
select(region, stat_cause_descr) %>%
group_by(region, stat_cause_descr) %>%
summarise(num_fire = n()) %>%
top_n(1) %>%
right_join(state_map_southern, by = "region") %>%
ggplot +
(aes(x = long, y = lat, group = group, fill = stat_cause_descr)) +
geom_polygon() +
geom_path(color = "white") +
theme_map() +
scale_fill_brewer(name = "Cause of Fires", palette = "PuBuGn") +
ggtitle("Total US Wildfires main cause from 2008-2011") +
theme(plot.title = element_text(hjust = 0.5))
`summarise()` regrouping output by 'region' (override with `.groups` argument)
Selecting by num_fire

ggsave("2008-2011.png")
Saving 7 x 7 in image
fires_states %>%
filter(fire_year == "2012" | fire_year == "2013" | fire_year == "2014" |
fire_year == "2015") %>%
filter(region == "florida" | region == "georgia" | region == "alabama" |
region == "mississippi" | region == "south carolina" |
region == "north carolina" | region == "tennessee" |
region == "arkansas" | region == "louisiana") %>%
select(region, stat_cause_descr) %>%
group_by(region, stat_cause_descr) %>%
summarise(num_fire = n()) %>%
top_n(1) %>%
right_join(state_map_southern, by = "region") %>%
ggplot +
(aes(x = long, y = lat, group = group, fill = stat_cause_descr)) +
geom_polygon() +
geom_path(color = "white") +
theme_map() +
scale_fill_brewer(name = "Cause of Fires", palette = "PuBuGn") +
ggtitle("Total US Wildfires main cause from 2012-2015") +
theme(plot.title = element_text(hjust = 0.5))
`summarise()` regrouping output by 'region' (override with `.groups` argument)
Selecting by num_fire

ggsave("2012-2015.png")
Saving 7 x 7 in image
Looking at these trends some interesting insights can be seen. For the combined years data Florida stands out as having railroad as its main cause of wildfire, but from the above plots it can be seen that these railroad fires are only the main cause up to the 4 yearly period ending in 2003 and then the main cause changes to lightning until the end of the collection period in 2015. Similarly arson seem reasonably popular in the southern states until 2007, when it no longer appears as the most common cause of wildfire. This downward trend was also noted earlier in the overall causation plots for all states
Correlation between states and fire size
fires_states %>%
select(region, fire_size_class) %>%
group_by(region, fire_size_class) %>%
summarise(num_fire = n()) %>%
top_n(1) %>%
right_join(state_map, by = "region") %>%
ggplot +
(aes(x = long, y = lat, group = group, fill = fire_size_class)) +
geom_polygon() +
geom_path(color = "white") +
theme_map() +
scale_fill_brewer(name = "Fire Size Class", palette = "PuBuGn") +
ggtitle("Most common wildfire size per State 1992-2015") +
theme(plot.title = element_text(hjust = 0.5))
`summarise()` regrouping output by 'region' (override with `.groups` argument)
Selecting by num_fire

fires_states %>%
select(region, fire_size_class) %>%
filter(fire_size_class == "G") %>%
group_by(region) %>%
summarise(num_fire = n()) %>%
right_join(state_map, by = "region") %>%
ggplot +
(aes(x = long, y = lat, group = group, fill = num_fire)) +
geom_polygon() +
geom_path(color = "white") +
theme_map() +
scale_fill_distiller(name = "Number of Fires", palette = "PuBuGn") +
ggtitle("Number of large class G fires per State 1992-2015") +
theme(plot.title = element_text(hjust = 0.5))
`summarise()` ungrouping output (override with `.groups` argument)

From the plots we can see that the Western states have the most small fires and also the most large fires! Not entirely the most helpful plots…
Are fires more prevalent in certain months for individual states
fires_states %>%
filter(fire_year == "1992" | fire_year == "1993" | fire_year == "1994" |
fire_year == "1995") %>%
select(region, discovery_moy) %>%
group_by(region, discovery_moy) %>%
summarise(num_fire = n()) %>%
top_n(1) %>%
right_join(state_map, by = "region") %>%
ggplot +
(aes(x = long, y = lat, group = group, fill = discovery_moy)) +
geom_polygon() +
geom_path(color = "white") +
theme_map() +
scale_fill_brewer(name = "Months of Year", palette = "PuBuGn") +
ggtitle("Month with most fires per State 1992-1995") +
theme(plot.title = element_text(hjust = 0.5))
`summarise()` regrouping output by 'region' (override with `.groups` argument)
Selecting by num_fire

fires_states %>%
filter(fire_year == "1996" | fire_year == "1997" | fire_year == "1998" |
fire_year == "1999") %>%
select(region, discovery_moy) %>%
group_by(region, discovery_moy) %>%
summarise(num_fire = n()) %>%
top_n(1) %>%
right_join(state_map, by = "region") %>%
ggplot +
(aes(x = long, y = lat, group = group, fill = discovery_moy)) +
geom_polygon() +
geom_path(color = "white") +
theme_map() +
scale_fill_brewer(name = "Months of Year", palette = "PuBuGn") +
ggtitle("Month with most fires per State 1996-1999") +
theme(plot.title = element_text(hjust = 0.5))
`summarise()` regrouping output by 'region' (override with `.groups` argument)
Selecting by num_fire

fires_states %>%
filter(fire_year == "2000" | fire_year == "2001" | fire_year == "2002" |
fire_year == "2003") %>%
select(region, discovery_moy) %>%
group_by(region, discovery_moy) %>%
summarise(num_fire = n()) %>%
top_n(1) %>%
right_join(state_map, by = "region") %>%
ggplot +
(aes(x = long, y = lat, group = group, fill = discovery_moy)) +
geom_polygon() +
geom_path(color = "white") +
theme_map() +
scale_fill_brewer(name = "Months of Year", palette = "PuBuGn") +
ggtitle("Month with most fires per State 2000-2003") +
theme(plot.title = element_text(hjust = 0.5))
`summarise()` regrouping output by 'region' (override with `.groups` argument)
Selecting by num_fire

fires_states %>%
filter(fire_year == "2004" | fire_year == "2005" | fire_year == "2006" |
fire_year == "2007") %>%
select(region, discovery_moy) %>%
group_by(region, discovery_moy) %>%
summarise(num_fire = n()) %>%
top_n(1) %>%
right_join(state_map, by = "region") %>%
ggplot +
(aes(x = long, y = lat, group = group, fill = discovery_moy)) +
geom_polygon() +
geom_path(color = "white") +
theme_map() +
scale_fill_brewer(name = "Months of Year", palette = "PuBuGn") +
ggtitle("Month with most fires per State 2004-2007") +
theme(plot.title = element_text(hjust = 0.5))
`summarise()` regrouping output by 'region' (override with `.groups` argument)
Selecting by num_fire

fires_states %>%
filter(fire_year == "2008" | fire_year == "2009" | fire_year == "2010" |
fire_year == "2011") %>%
select(region, discovery_moy) %>%
group_by(region, discovery_moy) %>%
summarise(num_fire = n()) %>%
top_n(1) %>%
right_join(state_map, by = "region") %>%
ggplot +
(aes(x = long, y = lat, group = group, fill = discovery_moy)) +
geom_polygon() +
geom_path(color = "white") +
theme_map() +
scale_fill_brewer(name = "Months of Year", palette = "PuBuGn") +
ggtitle("Month with most fires per State 2008-2011") +
theme(plot.title = element_text(hjust = 0.5))
`summarise()` regrouping output by 'region' (override with `.groups` argument)
Selecting by num_fire

fires_states %>%
filter(fire_year == "2012" | fire_year == "2013" | fire_year == "2014" |
fire_year == "2015") %>%
select(region, discovery_moy) %>%
group_by(region, discovery_moy) %>%
summarise(num_fire = n()) %>%
top_n(1) %>%
right_join(state_map, by = "region") %>%
ggplot +
(aes(x = long, y = lat, group = group, fill = discovery_moy)) +
geom_polygon() +
geom_path(color = "white") +
theme_map() +
scale_fill_brewer(name = "Months of Year", palette = "PuBuGn") +
ggtitle("Month with most fires per State 2012-2015") +
theme(plot.title = element_text(hjust = 0.5))
`summarise()` regrouping output by 'region' (override with `.groups` argument)
Selecting by num_fire

fires_states %>%
filter(fire_year == "2010" | fire_year == "2011" | fire_year == "2012" |
fire_year == "2013" | fire_year == "2014" | fire_year == "2015") %>%
select(region, discovery_moy) %>%
group_by(region, discovery_moy) %>%
summarise(num_fire = n()) %>%
top_n(1) %>%
right_join(state_map, by = "region") %>%
ggplot +
(aes(x = long, y = lat, group = group, fill = discovery_moy)) +
geom_polygon() +
geom_path(color = "white") +
theme_map() +
scale_fill_brewer(name = "Months of Year", palette = "PuBuGn") +
ggtitle("Month with most fires in per State 2010-2015") +
theme(plot.title = element_text(hjust = 0.5))
`summarise()` regrouping output by 'region' (override with `.groups` argument)
Selecting by num_fire

The above plots are quite interesting. The months of the year that have the most seems to widely change in certain state. Mainly the east half of the country have the most fires in the Spring (Feb-May) and the western part of the country have the most fires later on in Summer and Fall (Jun-Oct). There are however a few exceptions that can be seen in the 2004-2007 and 2008-2011 data Texas has the most fires in January. Florida also mostly conformed to the East/West split with the majority of its worst months for fires taking place in March or April up until 2007, then the most common month moves later into June and July for the rest of the reporting period until 2015. This may have to due with main cause of fires in Florida changing from railroad to lightning related about the same time, as we noted earlier on when looking at causation. As July is the main month for tropical storms and lightning in Florida this is a possible cause for the highest month becoming later in the year than before. (2)
- https://www.weather.gov/mlb/fl_lightning_climo
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KFJTUUxpdGUpCmxpYnJhcnkoZGJwbHlyKQpsaWJyYXJ5KGphbml0b3IpCmxpYnJhcnkobHVicmlkYXRlKQpsaWJyYXJ5KGRhdGFzZXRzKQpsaWJyYXJ5KGdndGhlbWVzKQpsaWJyYXJ5KGdnYW5pbWF0ZSkKbGlicmFyeShtb2RlbHIpCmxpYnJhcnkoYnJvb20pCmxpYnJhcnkoZ2dmb3J0aWZ5KQpsaWJyYXJ5KGluZmVyKQpgYGAKCgojIDEuICBEYXRhIENsZWFuaW5nCgoKIyMjIyAgQ3JlYXRpbmcgY29ubmVjdGlvbiB0byB0aGUgc3FsaXRlIGRhdGFiYXNlIGFuZCBkb3dubG9hZGluZyBmaXJlcyBkYXRhc2V0CgpgYGB7cn0KIyBDb25uZWN0aW5nCgpjb25uIDwtIGRiQ29ubmVjdChTUUxpdGUoKSwgInJhd19kYXRhL0ZQQV9GT0RfMjAxNzA1MDguc3FsaXRlIikKYGBgCgpgYGB7cn0KIyBQdWxsaW5nIGFsbCB0aGUgbmFtZXMgb2YgdGhlIHRhYmxlcyBpbiB0aGUgZGF0YWJhc2UgZmlsZQoKYXMuZGF0YS5mcmFtZShkYkxpc3RUYWJsZXMoY29ubikpCmBgYAoKYGBge3J9CiMgTWFraW5nIGZpcmVzIGRhdGFmcmFtZQoKZmlyZXMgPC0gdGJsKGNvbm4sICJGaXJlcyIpICU+JSBjb2xsZWN0KCkKYGBgCgoKIyMjIyBTZWVpbmcgd2hhdCBvdGhlciB1c2VmdWwgaW5mb3JtYXRpb24gaXMgaW4gdGhlIGRhdGFiYXNlLiAgVGhlIG1ham9yaXR5IGFyZSBwYXJ0IG9mIHRoZSBkYXRhYmFzZSBzdHJ1Y3R1cmUgYW5kIGFyZSBub3QgcmVhZGFibGUgaW4gUi4KCmBgYHtyfQojIEVQU0cgd29ybGR3aWRlIGdlb2RldGljIHBhcmFtZXRlciBkYXRhc2V0IHN5c3RlbQpzcGF0aWFsX3JlZiA8LSB0YmwoY29ubiwgInNwYXRpYWxfcmVmX3N5c19hbGwiKSAlPiUgY29sbGVjdCgpCgojIE5hdGlvbmFsIFdpbGRmaXJlIENvb3JkaW5hdGluZyBHcm91cCB1bml0IGFiYnJldmlhdGlvbnMgCk5XR0cgPC0gdGJsKGNvbm4sICJOV0NHX1VuaXRJREFjdGl2ZV8yMDE3MDEwOSIpICU+JSBjb2xsZWN0KCkKYGBgCgoKYGBge3J9CiMgRGlzY29ubmVjdAoKZGJEaXNjb25uZWN0KGNvbm4pCmBgYAoKCiMjIyBTZWxlY3RpbmcgY29sdW1ucyBvZiBpbnRlcmVzdAoKYGBge3J9CmZpcmVzX3NtYWxsIDwtIGZpcmVzICU+JQogIHNlbGVjdChOV0NHX1JFUE9SVElOR19BR0VOQ1ksIFNPVVJDRV9SRVBPUlRJTkdfVU5JVF9OQU1FLCBGSVJFX05BTUUsCiAgICAgICAgIEZJUkVfWUVBUiwgRElTQ09WRVJZX0RBVEUsIERJU0NPVkVSWV9ET1ksIERJU0NPVkVSWV9USU1FLCBDT05UX0RBVEUsCiAgICAgICAgIENPTlRfRE9ZLCBDT05UX1RJTUUsIFNUQVRfQ0FVU0VfQ09ERSwgU1RBVF9DQVVTRV9ERVNDUiwgRklSRV9TSVpFLCAKICAgICAgICAgRklSRV9TSVpFX0NMQVNTLCBMQVRJVFVERSwgTE9OR0lUVURFLCBPV05FUl9DT0RFLCBPV05FUl9ERVNDUiwgU1RBVEUsIAogICAgICAgICBDT1VOVFksIEZJUFNfQ09ERSwgRklQU19OQU1FLCBTaGFwZSkKCmZpcmVzX3NtYWxsIDwtIGNsZWFuX25hbWVzKGZpcmVzX3NtYWxsKQpgYGAKCgojIyMgQ2hhbmdpbmcgc29tZSBjb2x1bW1zIHRvIGJlIGZhY3RvcnMKCmBgYHtyfQpmaXJlc19zbWFsbCA8LSBmaXJlc19zbWFsbCAlPiUKICBtdXRhdGUobndjZ19yZXBvcnRpbmdfYWdlbmN5ID0gYXMuZmFjdG9yKG53Y2dfcmVwb3J0aW5nX2FnZW5jeSkpICU+JQogIG11dGF0ZShzdGF0X2NhdXNlX2NvZGUgPSBhcy5mYWN0b3Ioc3RhdF9jYXVzZV9jb2RlKSkgJT4lCiAgbXV0YXRlKGZpcmVfc2l6ZV9jbGFzcyA9IGFzLmZhY3RvcihmaXJlX3NpemVfY2xhc3MpKSAlPiUKICBtdXRhdGUob3duZXJfZGVzY3IgPSBhcy5mYWN0b3Iob3duZXJfZGVzY3IpKSAlPiUKICBtdXRhdGUoc3RhdGUgPSBhcy5mYWN0b3Ioc3RhdGUpKSAKYGBgCgoKIyMjIERhdGUgaXMgaW4gSnVsaWFuIGZvcm1hdCwgc28gb3ZlcndyaXRpbmcgd2l0aCBHcmVnb3JpYW4gZm9ybWF0IHVzaW5nIHllYXIgYW5kIGRheSBvZiB5ZWFyIGNvbHVtbnMuICBBbHNvIGFkZGluZyBpbiBhICdtb250aCBvZiB5ZWFyIGNvbHVtbicgZm9yIGZ1dHVyZSB1c2UuCgpgYGB7cn0KZmlyZXNfc21hbGwgPC0gZmlyZXNfc21hbGwgJT4lCiAgbXV0YXRlKGRhdGVfb3JpZ2luID0gYXMuRGF0ZShwYXN0ZTAoZmlyZV95ZWFyLCAiLTAxLTAxIikpKSAlPiUKICBtdXRhdGUoZGlzY292ZXJ5X2RhdGUgPSBhcy5EYXRlKGRpc2NvdmVyeV9kb3ksIG9yaWdpbiA9IGRhdGVfb3JpZ2luKSkgJT4lCiAgbXV0YXRlKGRpc2NvdmVyeV9tb3kgPSBtb250aChkaXNjb3ZlcnlfZGF0ZSwgbGFiZWwgPSBUUlVFKSkgJT4lCiAgc2VsZWN0KC1kYXRlX29yaWdpbikKYGBgCgoKCiMgMi4gQ3JlYXRpbmcgc29tZSBpbml0aWFsIHZpc3VhbGlzYXRpb25zCgoKIyMjIEZpcmVzIHBlciB5ZWFyCgpgYGB7cn0KeWVhcl9wbG90IDwtIGZpcmVzX3NtYWxsICU+JQogIGdyb3VwX2J5KGZpcmVfeWVhcikgJT4lCiAgc3VtbWFyaXNlKG51bV9maXJlcyA9bigpKQoKeWVhcl9wbG90ICU+JQogIGdncGxvdCArCiAgYWVzKHggPSBmaXJlX3llYXIsIHkgPSBudW1fZmlyZXMpICsKICBnZW9tX3BvaW50KCkgKwogIHlsaW0oMCwgMTIwMDAwKQogICMgZ2VvbV9jb2woZmlsbCA9ICJkYXJrIGJsdWUiLCBjb2wgPSJ3aGl0ZSIpICsKICAjIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGNvbG91ciA9ICJyZWQiKQoKYGBgCioqVGhlcmUgaXMgYSBsb3Qgb2YgdmFyaWF0aW9uIGluIHRoZSBkYXRhIGJldHdlZW4geWVhcnMuICBWaXN1YWxseSBpdCBsb29rcyBsaWtlIGEgcmVwZWF0aW5nIHBhdHRlcm4gaXMgb2NjdXJyaW5nIGV2ZXJ5IDUgeWVhcnMgb3Igc28gd2l0aCA0IHBlYWtzIHZpc2libGUgd2l0aGluIHRoaXMgcmVwb3J0aW5nIHBlcmlvZC4gIEhhdmluZyBsb29rZWQgYXQgdGhlIGhpc3RvcmljIHdlYXRoZXIgZm9yIHRoYXQgZGF0ZSByYW5nZSB0aGVzZSBwZWFrcyBzZWVtcyB0byBjb2luY2lkZSB3aXRoIHJlY29yZGVkIGhlYXR3YXZlcyBpbiAyMDAwLCAyMDA2IGFuZCAyMDExLigxKSoqCgpodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaXN0X29mX2hlYXRfd2F2ZXMKCgoKYGBge3J9Cm1vZGVsIDwtIGxtKGZvcm11bGEgPSBudW1fZmlyZXMgfiBmaXJlX3llYXIsIGRhdGEgPSB5ZWFyX3Bsb3QpCnN1bW1hcnkobW9kZWwpCmBgYApgYGB7cn0KdGlkeShtb2RlbCkKYGBgCgpgYGB7cn0KY2xlYW5fbmFtZXMoZ2xhbmNlKG1vZGVsKSkKYGBgCgpgYGB7cn0KYXV0b3Bsb3QobW9kZWwpCmBgYAoKCmBgYHtyfQp5ZWFyX3Bsb3QgJT4lCiAgYWRkX3ByZWRpY3Rpb25zKG1vZGVsKSAlPiUKICBhZGRfcmVzaWR1YWxzKG1vZGVsKQp5ZWFyX3Bsb3QKYGBgCgpgYGB7cn0KeWVhcl9wbG90ICU+JQogIGdncGxvdChhZXMoeCA9IGZpcmVfeWVhcikpICsKICBnZW9tX3BvaW50KGFlcyh5ID0gbnVtX2ZpcmVzKSkgKwogIGdlb21fYWJsaW5lKAogICAgaW50ZXJjZXB0ID0gbW9kZWwkY29lZmZpY2llbnRzWzFdLAogICAgc2xvcGUgPSBtb2RlbCRjb2VmZmljaWVudHNbMl0sCiAgICBjb2wgPSAicmVkIgogICkgKwogIHlsaW0oMCwgMTIwMDAwKQogIApgYGAKCgoKCgoKYGBge3J9CmJvb3RzdHJhcCA8LSB5ZWFyX3Bsb3QgJT4lCiAgc3BlY2lmeShmb3JtdWxhID0gbnVtX2ZpcmVzIH4gZmlyZV95ZWFyKSAlPiUKICBnZW5lcmF0ZShyZXBzID0gMTAwMDAsIHR5cGUgPSAiYm9vdHN0cmFwIikgJT4lCiAgY2FsY3VsYXRlKHN0YXQgPSAic2xvcGUiKQoKYm9vdHN0cmFwICU+JQogIHZpc3VhbGlzZShiaW5zPSAzMCkgKwogIHNoYWRlX2NpKGVuZHBvaW50cyA9IHNsb3BlX2NpOTUpCgpzbG9wZV9jaTk1IDwtIGJvb3RzdHJhcCAlPiUKICBnZXRfY2kobGV2ZWwgPSAwLjk1LCB0eXBlID0gInBlcmNlbnRpbGUiKSAKc2xvcGVfY2k5NQoKYGBgCgpgYGB7cn0KY2xlYW5fbmFtZXModGlkeShtb2RlbCwgY29uZi5pbnQgPSBUUlVFLCBjb25mLmxldmVsID0gMC45NSkpCmBgYAoKCgoKCgoKCiMjIyBGaXJlcyBwZXIgZGF5CgpgYGB7cn0KZmlyZXNfc21hbGwgJT4lCiAgZ3JvdXBfYnkoZGlzY292ZXJ5X2RhdGUpICU+JQogIHN1bW1hcmlzZShudW1fZmlyZXMgPSBuKCkpICU+JQogIGdncGxvdCArCiAgYWVzKHggPSBkaXNjb3ZlcnlfZGF0ZSwgeSA9IG51bV9maXJlcykgKwogIGdlb21fbGluZShjb2wgPSAiZGFyayBibHVlIikgCgpgYGAKCioqVGhpcyBzaG93cyBhIHR5cGljYWwgdGltZSBzZXJpZXMgcGxvdCB3aXRoIGEgY3ljbGljIHZhcmlhdGlvbiBkdWUgdG8gd2FybWVyIHdlYXRoZXIgaW4gdGhlIHN1bW1lciB0aW1lLioqCgoKIyMjIEZpcmVzIHBlciBtb250aAoKYGBge3J9CmZpcmVzX3NtYWxsICU+JQogIG11dGF0ZSh5ZWFyX21vbnRoID0gbWFrZV9kYXRlKGZpcmVfeWVhciwgZGlzY292ZXJ5X21veSkpICU+JQogIGdyb3VwX2J5KHllYXJfbW9udGgpICU+JQogIHN1bW1hcmlzZShudW1fZmlyZXMgPSBuKCkpICU+JQogIGdncGxvdCArCiAgYWVzKHggPSB5ZWFyX21vbnRoLCB5ID0gbnVtX2ZpcmVzKSArCiAgZ2VvbV9saW5lKGNvbCA9ICJkYXJrIGJsdWUiKSAKYGBgCgoqKlBlYWtzIGFyZSBzdGlsbCBzaG93biB0byBiZSBvY2N1cnJpbmcgaW4gdGhlIHN1bW1lci4gVGhlIDIwMDYgaGVhdHdhdmUgaXMgZXNwZWNpYWxseSB2aXNhYmxlLioqCgoKIyMjIEZpcmVzIGJ5IGRheSBvZiB5ZWFyCgoKYGBge3J9CmZpcmVzX3NtYWxsICU+JQogIGdyb3VwX2J5KGRpc2NvdmVyeV9kb3kpICU+JQogIHN1bW1hcmlzZShudW1fZmlyZXMgPSBuKCkpICU+JQogIGdncGxvdChhZXMoeCA9IGRpc2NvdmVyeV9kb3ksIHkgPSBudW1fZmlyZXMpKSArCiAgZ2VvbV9saW5lKGNvbCA9ICJkYXJrIGJsdWUiKQpgYGAKCgoqKlRoZSBhcmUgcGVha3MgYXJvdW5kIGRheSA2MC0xMTAgYW5kIGEgYmlnIHBlYWsgYXJvdW5kIDE4MC4qKgoKIyMjIyBDaGVja2luZyB0aGUgZGF0YSB0byBzZWUgd2hlcmUgdGhlIHBlYWsgb2NjdXJzCgpgYGB7cn0KZmlyZXNfc21hbGwgJT4lCiAgZ3JvdXBfYnkoZGlzY292ZXJ5X2RveSkgJT4lCiAgc3VtbWFyaXNlKG51bV9maXJlcyA9IG4oKSkgJT4lCiAgYXJyYW5nZShkZXNjKG51bV9maXJlcykpCmBgYAoqKlRoZSAyIGhpZ2hlc3QgZGF5cyBvZiB0aGUgeWVhciBhcmUgb24gMTg1IGFuZCAxODYsIHdoaWNoIGhhcHBlbnMgdG8gYmUgSW5kZXBlbmRlbmNlIERheSAoNHRoIEp1bHkpIG9uIGEgbm9ybWFsIHllYXIgYW5kIGEgbGVhcCB5ZWFyIHJldHJvc3BlY3RpdmVseS4gIFNvIEkgaW1hZ2luZSBtb3N0IG9mIHRoZSBleHRyYSBmaXJlcyAobGl0ZXJhbGx5IG92ZXIgZG91YmxlIHRoZSBub3JtYWwgYW1vdW50KSBhcmUgY2F1c2VkIGJ5IGZpcmV3b3Jrcy4qKgoKCgojIyMgRmlyZXMgYnkgbW9udGggb2YgeWVhcgoKYGBge3J9CmZpcmVzX3NtYWxsICU+JQogIGdyb3VwX2J5KGRpc2NvdmVyeV9tb3kpICU+JQogIHN1bW1hcmlzZShudW1fZmlyZXMgPSBuKCkpICU+JQogIGdncGxvdChhZXMoeCA9IGRpc2NvdmVyeV9tb3ksIHkgPSBudW1fZmlyZXMpKSArCiAgZ2VvbV9jb2woZmlsbCA9ICJkYXJrIGJsdWUiLCBjb2wgPSAid2hpdGUiKQpgYGAKCioqVGhlcmUgYXJlIDIgZGVmaW5pdGUgcGVha3MgZHVyaW5nIHRoZSB5ZWFyLiAgTWFyY2ggYW5kIEFwcmlsIGFyZSBwcm9iYWJseSBkdWUgdG8gdGhlIFVTICJTcHJpbmcgQnJlYWsiLCB3aGVyZSBzY2hvb2xzIGFuZCBVbml2ZXJzaXRpZXMgYXJlIHN0b3BwZWQgYW5kIHNvIGZhbWlsaWVzIGFyZSBsaWtlbHkgdG8gYmUgb24gdmFjYXRpb24gZHVyaW5nIHRoYXQgcGVyaW9kIHBvc3NpYmx5IHZpc2l0aW5nIE5hdGlvbmFsIFBhcmtzLiAgSnVseSBhbmQgQXVndXN0IGlzIGFsc28gU3VtbWVyIEJyZWFrIGZvciBzY2hvb2wgd2l0aCBib3RoIGZhbWlsaWVzIHZpc2l0aW5nIFBhcmtzIGFuZCBob3Qgd2VhdGhlciBsaWtlbHkgY2F1c2VzIG9mIGZpcmUgb3V0YnJlYWtzLioqCgoKCgojIyMgRmlyZXMgYnkgY2F1c2UKCmBgYHtyfQpvcHRpb25zKHNjaXBlbiA9IDk5OSkKCmZpcmVzX3NtYWxsICU+JQogIGdyb3VwX2J5KHN0YXRfY2F1c2VfZGVzY3IpICU+JQogIHN1bW1hcmlzZShudW1fZmlyZXMgPSBuKCkpICU+JQogIGdncGxvdCArCiAgYWVzKHJlb3JkZXIoeCA9IHN0YXRfY2F1c2VfZGVzY3IsIG51bV9maXJlcyksIHkgPSBudW1fZmlyZXMpICsKICBnZW9tX2NvbChmaWxsID0gImRhcmsgYmx1ZSIpICsgCiAgY29vcmRfZmxpcCgpIApgYGAKCgojIyMgRmlyZSBhdmcgc2l6ZSBieSBjYXVzZQoKYGBge3J9CmZpcmVzX3NtYWxsICU+JQogIGdyb3VwX2J5KHN0YXRfY2F1c2VfZGVzY3IpICU+JQogIHN1bW1hcmlzZShhdmdfc2l6ZSA9IG1lYW4oZmlyZV9zaXplKSkgJT4lCiAgZ2dwbG90ICsKICBhZXMocmVvcmRlcih4ID0gc3RhdF9jYXVzZV9kZXNjciwgYXZnX3NpemUpLCB5ID0gYXZnX3NpemUpICsKICBnZW9tX2NvbChmaWxsID0gImRhcmsgYmx1ZSIpICsgCiAgY29vcmRfZmxpcCgpCmBgYAoKCiMjIyBBdmcgYnVybiB0aW1lIGJ5IGNhdXNlCgpgYGB7cn0KZmlyZXNfc21hbGwgJT4lCiAgc3VtbWFyaXNlKG51bV9uYSA9IHN1bShpcy5uYShjb250X2RhdGUpKSkKYGBgCipMaXRlcmFsbHkgaGFsZiB0aGUgZGF0YSBpcyBtaXNzaW5nIGZvciBidXJuIHRpbWUsIG1ha2luZyBpdCB2ZXJ5IGRpZmZpY3VsdCB0byBkbyBhbnkgbWVhbmluZ2Z1bCBhbmFseXNpcyoKCgoKIyMjIEZpcmVzIGJ5IHNpemUKCgpgYGB7cn0KZmlyZXNfc21hbGwgJT4lCiAgZ3JvdXBfYnkoZmlyZV9zaXplX2NsYXNzKSAlPiUKICBzdW1tYXJpc2UobnVtX2ZpcmVzID0gbigpKSAlPiUKICBnZ3Bsb3QgKwogIGFlcyh4ID0gZmlyZV9zaXplX2NsYXNzLCB5ID0gbnVtX2ZpcmVzLCBmaWxsID0gZmlyZV9zaXplX2NsYXNzKSArCiAgZ2VvbV9jb2woKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygicmVkIiwgIm9yYW5nZSIsICJ5ZWxsb3ciLCAiZ3JlZW4iLCAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB1cnBsZSIsICJibGFjayIpLAogICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiRmlyZSBTaXplIENsYXNzaWZpY2F0aW9uIiwKICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKCJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIsICJHIiksCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQTogPCAxLzQgYWNyZSIsICJCOiAxLzQgdG8gMTAgYWNyZXMiLCAiQzogMTAgdG8gMTAwIGFjcmVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEOiAxMDAgdG8gMzAwIGFjcmVzIiwgIkU6IDMwMCB0byAxMDAwIGFjcmVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGOiAxMDAwIHRvIDUwMDAgYWNyZXMiLCAiRzogTW9yZSB0aGFuIDUwMDAgYWNyZXMiKSkKCmBgYAoKCgojIEdlbyBTcGF0aWFsIHdyYW5nbGluZyAKCgojIyMgVG8gbWFrZSBpdCBlYXNpZXIgdG8gdmlzdWFsbHkgZGV0ZWN0IGZyZXF1ZW5jeSBvZiB3aWxkZmlyZXMgYmV0d2VlbiBzdGF0ZXMgSSB3YW50IGRpc3BsYXkgaXQgaW4gYSBtYXAgZm9ybWF0LiAgQXMgSSdtIHVzaW5nIGdncGxvdDIgYWxyZWFkeSBJJ20gZ29pbmcgdG8gYWxzbyB1c2UgaXQgZm9yIG1hcHMgd2l0aCB0aGUgYGdlb21fcG9seWdvbigpYCwgYGNvb3JkX21hcCgpYCBhbG9uZyB3aXRoIHRoZSBnZ3RoZW1lcyBgdGhlbWVfbWFwKClgIGZ1bmN0aW9ucy4KCgojIyMjIEknbSBub3QgZW50aXJlbHkgc3VyZSB3aGF0IGdlby1zcGF0aWFsIGluZm9ybWF0aW9uIGlzIGJlaW5nIGhlbGQgd2l0aCBpbiB0aGUgc3FsaXRlIGRhdGFiYXNlIGZpbGUsIEkndmUgbWFkZSBhIGZldyBhdHRlbXB0cyB0byByZXRyaWV2ZSBpdCBidXQgaGF2ZSBiZWVuIHVuc3VjY2Vzc2Z1bC4gIFRoZXJlZm9yZSBJJ20gZ29pbmcgdG8gdXRlbGlzZSB0aGUgYGRhdGFzZXRzYCBwYWNrYWdlIHdoaWNoIGluY2x1ZGVzIHZhcmlvdXMgYml0cyBvZiBpbmZvcm1hdGlvbiBvbiB0aGUgVVMgU3RhdGVzLCBpbmNsdWRpbmcgY29vcmRpbmF0ZXMgZm9yIHN0YXRlIGJvdW5kYXJpZXMuCgoKYGBge3J9CiMgU3RhdGUgYm91bmRhcnkgY28tb3JkaW5hdGVzIGZyb20gJ2RhdGFzZXRzJyBwYWNrYWdlCgpzdGF0ZV9tYXAgPC0gbWFwX2RhdGEoInN0YXRlIikKc3RhdGVfbWFwCmBgYAoKCiMjIyMgQW5ub3lpbmdseSBpdCBkb2Vzbid0IGhhdmUgdGhlIGFiYnJldmlhdGlvbiBvZiB0aGUgU3RhdGUsIG9ubHkgdGhlIGZ1bGwgbmFtZSBzbyBJIG5lZWQgdG8gYWRkIHRoYXQgaW4uICBMdWNraWx5IHRoZSAnZGF0YXNldHMnIHBhY2thZ2UgYWxzbyBoYXMgYSB2ZWN0b3Igb2YgU3RhdGVzIG5hbWVzIGFuZCBhYmJyZXZpYXRpb25zIHNvIEkgc2hhbGwgbWFrZSBhIHRpYmJsZSB3aXRoIHRoZW0gYm90aCBpbi4KCgpgYGB7cn0Kc3RhdGUuYWJiCmBgYAoKYGBge3J9CnN0YXRlLm5hbWUKYGBgCgpgYGB7cn0Kc3RhdGVfbGlzdCA8LSB0aWJibGUoc3RhdGUgPSBzdGF0ZS5hYmIsIHN0YXRlX25hbWUgPSBzdGF0ZS5uYW1lKQpzdGF0ZV9saXN0CmBgYAoKCiMjIyMgVGhlIGBzdGF0ZV9tYXBgIGRhdGFmcmFtZSBpcyBpbiBsb3dlciBjYXNlIGFuZCBoYXMgdGhlIGNvbHVtbiBuYW1lICdyZWdpb24nLiAgSSBzaGFsbCBjaGFuZ2UgdGhlIGBzdGF0ZV9saXN0YCB0aWJibGUgdG8gYmUgdGhlIHNhbWUgZm9ybWF0IHNvIHRoZXkgY2FuIGJlIGpvaW5lZCB0b2dldGhlci4KCgpgYGB7cn0Kc3RhdGVfbGlzdCA8LSB0aWJibGUoc3RhdGUgPSBzdGF0ZS5hYmIsIHJlZ2lvbiA9IHRvbG93ZXIoc3RhdGUubmFtZSkpCmBgYAoKCiMjIyMgSm9pbmcgYHN0YXRlX2xpc3RgIHRvIGBmaXJlc19zbWFsbGAgZGF0YXNldHMKCmBgYHtyfQpmaXJlc19zdGF0ZXMgPC0gZmlyZXNfc21hbGwgJT4lCiAgbGVmdF9qb2luKHN0YXRlX2xpc3QsIGJ5ID0gInN0YXRlIikKCmZpcmVzX3N0YXRlcwpgYGAKCgojIyMjIENoZWNraW5nIHRoZSBqb2luIGhhcyB3b3JrZWQgYW5kIHRoZXJlIGFyZSBubyBtaXNzaW5nIHZhbHVlcy4KCmBgYHtyfQpmaXJlc19zdGF0ZXMgJT4lCiAgZmlsdGVyKGlzLm5hKHJlZ2lvbikpCmBgYAoKCiMjIyMgVGhlcmUgZG9lcyBzZWVtIHRvIGJlIDIyLDE0NyBOQXMgaW4gdGhlICdyZWdpb24nIGNvbHVtbiB3ZSBqdXN0IG1hZGUuICBTY3JvbGxpbmcgdGhyb3VnaCB0aGVyZSBhcmUgMiBtaXNzaW5nIFN0YXRlcyBvZiAnUFInIGFuZCAnREMnIGluIHRoZSBgc3RhdGVzX2xpc3RgIHRpYmJsZS4KCiMjIyMgQWZ0ZXIgc29tZSBxdWljayByZXNlYXJjaCBpdCBzZWVtcyB0aGF0IHRoZXJlIGFyZSBvbmx5IDUwIFN0YXRlcyBpbiB0aGUgVVMuIFdhc2hpbmd0b24gREMgaXMgdGVjaGluY2FsbHkgbm90IGNvdW50ZWQgYXMgYSBzdGF0ZSBidXQgYXMgYSBGZWRlcmFsIERpc3RyaWN0LCBhcyBpdCBpcyB0aGUgc2VhdCBvZiBnb3Zlcm5tZW50LCBzbyB0aGF0IHdhcyB3aHkgaXQgd2Fzbid0IGluY2x1ZGVkIGluIHRoZSBgU3RhdGVzYCB0aWJibGUgb3JpZ2luYWxseS4gIFBSIGlzIFB1ZXJ0byBSaWNvIGFuZCBpcyBhbHNvIG5vdCBhIHN0YXRlIGJ1dCB0aGUgbGFyZ2VzdCBVUyB0ZXJyaXRvcnkgLgoKCiMjIyMgSSBzaGFsbCBhZGQgREMgYW5kIFBSIGludG8gdGhlIHN0YXRlX2xpc3QgYW5kIHJlLWpvaW4gaXQuCgpgYGB7cn0KIyBBZGRpbmcgMiBuZXcgc3RhdGVzCgpzdGF0ZS5hYmIgPC0gYXBwZW5kKHN0YXRlLmFiYiwgYygiREMiLCAiUFIiKSkKc3RhdGUubmFtZSA8LSBhcHBlbmQoc3RhdGUubmFtZSwgYygiRGlzdHJpY3Qgb2YgQ29sdW1iaWEiLCAiUHVlcnRvIFJpY28iKSkKCnN0YXRlX2xpc3QgPC0gdGliYmxlKHN0YXRlID0gc3RhdGUuYWJiLCByZWdpb24gPSB0b2xvd2VyKHN0YXRlLm5hbWUpKQpgYGAKCgpgYGB7cn0KIyBSZS1qb2luZyB0aWJibGVzCgpmaXJlc19zdGF0ZXMgPC0gZmlyZXNfc21hbGwgJT4lCiAgbGVmdF9qb2luKHN0YXRlX2xpc3QsIGJ5ID0gInN0YXRlIikKYGBgCgoKYGBge3J9CiMgQ2hlY2tpbmcgdGhlIGpvaW4gaGFzIHdvcmtlZCBwcm9wZXJseSBhbmQgdGhlcmUgYXJlIG5vIE5BcwoKZmlyZXNfc3RhdGVzICU+JQogIGZpbHRlcihpcy5uYShyZWdpb24pKQpgYGAKCmBgYHtyfQojIENvZGUgYmVsb3cgYnJpbmdzIHVwIGEgInZlY3RvciBtZW1vcnkgZXhoYXVzdGVkIChsaW1pdCByZWFjaGVkPykiIGVycm9yCgojIGZpcmVzX2pvaW5lZCA8LSBmaXJlc19zdGF0ZXMgJT4lCiMgIHJpZ2h0X2pvaW4oc3RhdGVfbWFwLCBieSA9ICJyZWdpb24iKQpgYGAKCgojIyMjIFRoZSBkYXRhIHNldCBhbmQgZ2VvIGluZm9ybWF0aW9uIGlzIHRvbyBiaWcgdG8gam9pbiBzbyBJJ20gZ29pbmcgdG8gZG8gYSBzdW1tYXJpc2UgZmlyc3QgdG8gZ2V0IHRoZSBudW1iZXIgb2YgZmlyZXMgcGVyIHJlZ2lvbiBmaXJzdC4KCmBgYHtyfQpmaXJlc19qb2luZWQgPC0gZmlyZXNfc3RhdGVzICU+JSAKICAgIHNlbGVjdChyZWdpb24pICU+JQogICAgZ3JvdXBfYnkocmVnaW9uKSAlPiUKICAgIHN1bW1hcmlzZShudW1fZmlyZXMgPSBuKCkpICU+JQogICAgcmlnaHRfam9pbihzdGF0ZV9tYXAsIGJ5ID0gInJlZ2lvbiIpCmBgYAoKKipSZXN1bHQhISAgTm93IGRvaW5nIGZpcnN0IGdlbyBzcGF0aWFsIHZpc3VhbGlzYXRpb24qKgoKCiMjIyBUb3RhbCBXaWxkZmlyZXMgcGVyIHN0YXRlIGZyb20gMTk5Mi0yMDE1CgpgYGB7cn0KZmlyZXNfam9pbmVkICU+JSAKICAgIGdncGxvdCArCiAgICAoYWVzKHggPSBsb25nLCB5ID0gbGF0LCBncm91cCA9IGdyb3VwLCBmaWxsID0gbnVtX2ZpcmVzKSkgKyAKICAgIGdlb21fcG9seWdvbigpICsgCiAgICBnZW9tX3BhdGgoY29sb3IgPSAid2hpdGUiKSArIAogICAgc2NhbGVfZmlsbF9jb250aW51b3VzKGxvdyA9ICJkYXJrYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2ggPSAiZGFya3JlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJOdW1iZXIgb2YgZmlyZXMiKSArIAogICAgdGhlbWVfbWFwKCkgKyAKICAgIGNvb3JkX21hcCgibW9sbHdlaWRlIikgKyAKICAgIGdndGl0bGUoIlRvdGFsIFVTIFdpbGRmaXJlcyBmcm9tIDE5OTItMjAxNSIpICsgCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKYGBgCgoKIyAzLiBHZW8gU3BhdGlhbCBWaXN1YWxpc2F0aW9ucwoKIyMjIFRoZSBkYXRhc2V0IGhhcyBhIGNhdXNlIG9mIGZpcmUgY29sdW1uIHNvIEkgc2hhbGwgbm93IGNyZWF0ZSBzb21lIGNhdXNhdGlvbiBwbG90cy4KCgojIyMjIEdldHRpbmcgbGlzdCBvZiBmaXJlIGNhdXNlcwoKYGBge3J9CmZpcmVzX3N0YXRlcyAlPiUKICBkaXN0aW5jdChzdGF0X2NhdXNlX2Rlc2NyKSAlPiUKICBhcnJhbmdlKC1kZXNjKHN0YXRfY2F1c2VfZGVzY3IpKQpgYGAKCgojIyMgVG90YWwgZmlyZSBieSBjYXVzZSBpbiB0YWJ1bGFyIGZvcm0KCmBgYHtyfQpmaXJlc19zdGF0ZXMgJT4lCiAgc2VsZWN0KHN0YXRfY2F1c2VfZGVzY3IpICU+JQogIGdyb3VwX2J5KHN0YXRfY2F1c2VfZGVzY3IpICU+JQogIHN1bW1hcmlzZShudW1fZmlyZXMgPSBuICgpKSAlPiUKICBhcnJhbmdlKGRlc2MobnVtX2ZpcmVzKSkKICAKYGBgCgojIyMgTnVtYmVyIG9mIGZpcmVzIGJ5IHN0YXRlIGluIHRhYnVsYXIgZm9ybQoKYGBge3J9CmZpcmVzX3N0YXRlcyAlPiUKICBzZWxlY3QocmVnaW9uKSAlPiUKICBncm91cF9ieShyZWdpb24pICU+JQogIHN1bW1hcmlzZShudW1fZmlyZXMgPSBuKCkpICU+JQogIGFycmFuZ2UoZGVzYyhudW1fZmlyZXMpKQpgYGAKCgojIyMjIEFzIHRoZSBjYXVzZSBuZWVkcyB0byBiZSBmaWx0ZXJlZCBiZWZvcmUgdGhlIG1hcCBqb2luLCBJJ20gZ29pbmcgdG8gZWl0aGVyIGdvaW5nIHRvIGhhdmUgdG8gcmVwZWF0IGEgd2hvbGUgbG9hZCBvZiB0aGUgc2FtZSBjb2RlIGluIGV2ZXJ5IHNpbmdsZSBwbG90IG9yIHdyaXRlIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGRvIGl0IGZvciBtZSB3aXRoLCBzYXZpbmcgYSBsb3Qgb2YgdHlwaW5nIQoKYGBge3J9CiMgRnVuY3Rpb24gZm9yIHBsb3R0aW5nIGNhdXNlIG9mIGZpcmUKCmNhdXNlIDwtIGZ1bmN0aW9uKGNhdXNlKSB7CiAgZmlyZXNfc3RhdGVzICU+JQogICAgZmlsdGVyKHN0YXRfY2F1c2VfZGVzY3IgPT0gY2F1c2UpICU+JQogICAgc2VsZWN0KHJlZ2lvbikgJT4lCiAgICBncm91cF9ieShyZWdpb24pICU+JQogICAgc3VtbWFyaXNlKG51bV9maXJlcyA9IG4gKCkpICU+JQogICAgcmlnaHRfam9pbihzdGF0ZV9tYXAsIGJ5ID0gInJlZ2lvbiIpICU+JQogICAgZ2dwbG90ICsKICAgIChhZXMoeCA9IGxvbmcsIHkgPSBsYXQsIGdyb3VwID0gZ3JvdXAsIGZpbGwgPSBudW1fZmlyZXMpKSArIAogICAgZ2VvbV9wb2x5Z29uKCkgKyAKICAgIGdlb21fcGF0aChjb2xvciA9ICJ3aGl0ZSIpICsgCiAgICBzY2FsZV9maWxsX2NvbnRpbnVvdXMobG93ID0gImRhcmtibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaCA9ICJkYXJrcmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIk51bWJlciBvZiBmaXJlcyIpICsgCiAgICB0aGVtZV9tYXAoKSArIAogICAgY29vcmRfbWFwKCJtb2xsd2VpZGUiKSArIAogICAgZ2d0aXRsZShwYXN0ZTAoIlRvdGFsIFVTIFdpbGRmaXJlcyBjYXVzZWQgYnkgIiwgY2F1c2UsICIgZnJvbSAxOTkyLTIwMTUiKSkgKyAKICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQp9CmBgYAoKCgojIyMgV2lsZGZpcmVzIGNhdXNlZCBieSBBcnNvbgoKYGBge3J9CmNhdXNlKCJBcnNvbiIpCmBgYAoKKipBcnNvbiBkb2VzIHNlZW0gbW9yZSBwcmV2YWxlbnQgaW4gdGhlIFNFIHN0YXRlcyBvZiBNaXNzaXNzaXBwaSwgR2VvcmdpYSwgQWxhYmFtYSBhbmQgYWxzbyB0aGUgd2VzdGVybiBzdGF0ZSBvZiBDYWxpZm9ybmlhLioqCgoKIyMjIFdpbGRmaXJlcyBjYXVzZWQgYnkgQ2FtcGZpcmUKCmBgYHtyfQpjYXVzZSgiQ2FtcGZpcmUiKQpgYGAKCioqQ2FtcGZpcmVzIGFyZSB0aGUgbW9zdCBwcmV2YWxlbnQgaW4gdGhlIFdlc3Rlcm4gc3RhdGVzIG9mIE9yZWdvbiwgQ2FsaWZvcm5pYSBhbmQgQXJpem9uYS4qKgoKCiMjIyBXaWxkZmlyZXMgY2F1c2VkIGJ5IENoaWxkcmVuCgpgYGB7cn0KY2F1c2UoIkNoaWxkcmVuIikKYGBgCgoqKkZpcmVzIGJ5IGNoaWxkcmVuIGFyZSBzcHJlYWQgYWJvdXQgdGhlIGNvdW50cnksIGJ1dCB0aGUgbW9zdCBwcmV2YWxlbnQgc3RhdGVzIGFyZSBDYWxpZm9ybmlhIGluIHRoZSBXZXN0LCBBbGFiYW1hIGFuZCBTb3V0aCBDYXJvbGluYSBhbmQgTmV3IEplcnNleSBpbiB0aGUgZWFzdC4qKgoKCiMjIyBXaWxkZmlyZXMgY2F1c2VkIGJ5IERlYnJpcyBCdXJuaW5nCgpgYGB7cn0KY2F1c2UoIkRlYnJpcyBCdXJuaW5nIikKYGBgCgoqKkZpcmVzIGJ5IGJ1cm5pbmcgZGVicmlzIGFyZSBtb3N0bHkgaW4gdGhlIHNvdXRoZXJuIHdhcm1lciBzdGF0ZXMgb2YgVGV4YXMsIEdlb3JnaWEgYW5kIE5vcnRoIENhcm9saW5hLioqCgojIyMgV2lsZGZpcmVzIGNhdXNlZCBieSBFcXVpbWVudCBVc2UKCmBgYHtyfQpjYXVzZSgiRXF1aXBtZW50IFVzZSIpCmBgYAoKKipNb3N0IG9mIHRoZSBmaXJlcyBjYXVzZWQgYnkgZXF1aXBtZW50IHNlZW0gdG8gYmUgaW4gQ2FsaWZvcm5pYSoqCgoKIyMjIFdpbGRmaXJlcyBjYXVzZWQgYnkgRmlyZXdvcmtzCgpgYGB7cn0KY2F1c2UoIkZpcmV3b3JrcyIpCmBgYAoKKipNb3N0IG9mIHRoZSBmaXJlcyBjYXVzZWQgYnkgZmlyZXdvcmtzIHNlZW0gdG8gYmUgaW4gdGhlIG5vcnRoIG9mIHRoZSBjb3VudHJ5LiAgUHJpbWFyaWx5IFNvdXRoIERha290YSwgTW9udGFuYSBhbmQgV2FzaGluZ3RvbiBzdGF0ZS4qKgoKCiMjIyBXaWxkZmlyZXMgY2F1c2VkIGJ5IExpZ2h0bmluZwoKYGBge3J9CmNhdXNlKCJMaWdodG5pbmciKQpgYGAKCioqQXBhcnQgZnJvbSBhIGhvdHNwb3Qgb2YgbGlnaHRuaW5nIHN0cmlrZXMgaW4gRmxvcmlkYSwgdGhlIHZhc3QgbWFqb3JpdHkgb2YgZmlyZXMgY2F1c2VkIGJ5IGxpZ2h0bmluZyBhcmUgaW4gdGhlIFdlc3Qgb2YgdGhlIGNvdW50cnkuICBXaXRoIHRoZSAzIG1vc3QgYWZmZWN0ZWQgc3RhdGVzIGJlaW5nIENhbGlmb3JuaWEsIE9yZWdvbiBhbmQgQXJpem9uYS4qKgoKIyMjIFdpbGRmaXJlcyBjYXVzZWQgYnkgTWlzY2VsbGlvdXMKCmBgYHtyfQpjYXVzZSgiTWlzY2VsbGFuZW91cyIpCmBgYAoKKipUaGVyZSBzZWVtcyB0byBiZSBxdWl0ZSBhIGZldyBtaXNjZWxsYW5lb3VzIGNsYXNzaWZpY2F0aW9ucyBpbiBDYWxpZm9ybmlhLCBUZXhhcyBhbmQgTmV3IFlvcmsuKioKCgojIyMgV2lsZGZpcmVzIGNhdXNlZCBieSBNaXNzaW5nL1VuZGVmaW5lZAoKYGBge3J9CmNhdXNlKCJNaXNzaW5nL1VuZGVmaW5lZCIpCmBgYAoKKipUaGUgc3RhdGVzIHdpdGggdGhlIG1vc3QgbWlzc2luZyBvciB1bmRlZmluZWQgZGF0YSBpcyBOb3J0aCBhbmQgU291dGggQ2Fyb2xpbmEsIE9rbGFob21hIGFuZCBDYWxpZm9ybmlhLioqCgoKIyMjIFdpbGRmaXJlcyBjYXVzZWQgYnkgUG93ZXJsaW5lCgpgYGB7cn0KY2F1c2UoIlBvd2VybGluZSIpCmBgYAoKKipUZXhhcyBoYXMgdGhlIGxhcmdlc3QgYW1vdW50IG9mIHdpbGRmaXJlcyBjYXVzZWQgYnkgcG93ZXJsaW5lcy4gIFRoaXMgaXMgbGlrZWx5IGR1ZSB0byB0aGUgd2FybSBjbGltYXRlIGFuZCB0aGUgbGFyZ2UgcHJvcG9ydGlvbiBvZiB0aGUgc3RhdGUgdGhhdCBpcyBkcnkgZ3Jhc3NsYW5kcyB1c2VkIGZvciBhZ3JpY3VsdHVyZS4gKDEpICoqCgooMSkgaHR0cHM6Ly91ay5yZXV0ZXJzLmNvbS9hcnRpY2xlL3VzLXdpbGRmaXJlcy10ZXhhcy90cmVlcy1hbmQtcG93ZXItbGluZXMtY2F1c2VkLW1ham9yLXRleGFzLWZpcmUtaWRVU1RSRTc4Sjc2QTIwMTEwOTIwCgoKIyMjIFdpbGRmaXJlcyBjYXVzZWQgYnkgUmFpbHJvYWQKCmBgYHtyfQpjYXVzZSgiUmFpbHJvYWQiKQpgYGAKCioqQnkgZmFyIEZsb3JpZGEgaGFzIHRoZSBtb3N0IHdpbGRmaXJlcyBjYXVzZWQgYnkgcmFpbHJvYWRzLioqCgoKIyMjIFdpbGRmaXJlcyBjYXVzZWQgYnkgU21va2luZwoKYGBge3J9CmNhdXNlKCJTbW9raW5nIikKYGBgCgoqKkZpcmVzIGNhdXNlZCBieSBzbW9raW5nIHNlZW0gdG8gYmUgc3ByZWFkIGFyb3VuZCB0aGUgY291bnRyeSwgYnV0IG1haW5seSBvbiB0aGUgZWFzdCBhbmQgd2VzdCBjb2FzdHMuKioKCgojIyMgV2lsZGZpcmVzIGNhdXNlZCBieSBTdHJ1Y3R1cmUKCmBgYHtyfQpjYXVzZSgiU3RydWN0dXJlIikKYGBgCgoqKlNvdXRoIERha290YSBoYXMgdGhlIGxhcmdlc3QgcHJvcG9ydGlvbiBvZiBmaXJlcyBjYXVzZWQgYnkgc3RydWN0dXJlcy4qKgoKCgojIyMjIFVuc3VycHJpc2luZ2x5IHRoZSBzb3V0aGVybiBzdGF0ZXMgc2VlbSB0byBoYXZlIG1vcmUgb2NjdXJlbmNlcyBvZiB3aWxkaWZyZSBpbiBnZW5lcmFsLCBubyBkb3VidCBkdWUgdG8gdGhlIHdhcm1lciBjbGltYXRlIGF0IHRoZWlyIGxhdGl0dWRlcy4gIEFsc28gdGhlIDFzdCBhbmQgM3JkIHN0YXRlcyB3aXRoIHRoZSBoaWdoZXN0IG51bWJlciBvZiBmaXJlcyBhcmUgYWxzbyB0aGUgMiBsYXJnZXN0IFN0YXRlcyBieSBzaXplLiBIb3dldmVyIHRoZSAybmQgaGlnaGVzdCBTdGF0ZSBpcyBHZW9yZ2lhLCB3aGljaCBhbHRob3VnaCBpdCBpcyBpbiB0aGUgU291dGggb2YgdGhlIGNvdW50cnkgaXMgb25seSBhbiBhdmVyYWdlIHNpemVkIFN0YXRlLiAgVGhlcmVmb3JlIHRvIGdldCBhIGJldHRlciBwaWN0dXJlIG9mIHdoYXQgaXMgZ29pbmcgb24gSSdtIGdvaW5nIHRvIGxvb2sgYXQgdGhlIHByb3BvcnRpb24gb2YgZmlyZXMgb2NjdXJpbmcgYnkgc3F1YXJlIG1pbGUgYnkgbm9ybWFsaXNpbmcgdGhlIFN0YXRlIHNpemUuCgojIyMjIFRoZSBgZGF0YXNldGAgcGFja2FnZSBhbHNvIGhhcyB0aGUgYXJlYSBpbiBzcXVhcmUgbWlsZXMgb2YgZWFjaCBzdGF0ZSBpbmNsdWRlZCBpbiB0aGUgYHN0YXRlLmFyZWFgIHZlY3Rvci4KCmBgYHtyfQpzdGF0ZS5hcmVhCmBgYAoKYGBge3J9Cmxlbmd0aChzdGF0ZS5hcmVhKQpgYGAKCiMjIyMgQW5ub3lpbmdseSBpdCBhbHNvIG9ubHkgaGFzIDUwIHN0YXRlcyBub3QgNTIgc28gSSB3aWxsIG5lZWQgdG8gYWRkIGluIERDIGFuZCBQUiBiYWNrIGluLiAgCgooQXJlYSBmaWd1cmVzIG9idGFpbmVkIGZyb20gV2lraXBlZGlhKQoKREMgPSA2OCBtaWxlc14yClBSID0gMzUxNSBtaWxlc14yCgoKYGBge3J9CiMgVG8gbWFrZSBteSBsaWZlIGVhc2llciBJJ20gZ29pbmcgdG8gcmVtb3ZlIHRoZSBzdGF0ZS5hYmIgYW5kIC5uYW1lIGZpbGVzIGFuZCBtYWtlIHRoZSB0aWJibGUgYWdhaW4sIGFkZGluZyBpbiB0aGUgbGFuZCBhcmVhIGZpZ3VyZXMgYXQgdGhlIHNhbWUgdGltZSB0byBtYWtlIHN1cmUgdGhleSBhcmUgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuCgpybShzdGF0ZS5hYmIpCnJtKHN0YXRlLm5hbWUpCgpzdGF0ZS5hYmIgPC0gYXBwZW5kKHN0YXRlLmFiYiwgYygiREMiLCAiUFIiKSkKc3RhdGUubmFtZSA8LSBhcHBlbmQoc3RhdGUubmFtZSwgYygiRGlzdHJpY3Qgb2YgQ29sdW1iaWEiLCAiUHVlcnRvIFJpY28iKSkKc3RhdGUuYXJlYSA8LSBhcHBlbmQoc3RhdGUuYXJlYSwgYygiNjgiLCAiMzUxNSIpKQoKc3RhdGVfbGlzdCA8LSB0aWJibGUoc3RhdGUgPSBzdGF0ZS5hYmIsIHJlZ2lvbiA9IHRvbG93ZXIoc3RhdGUubmFtZSksIGFyZWEgPSBhcy5udW1lcmljKHN0YXRlLmFyZWEpKQpgYGAKCmBgYHtyfQojIFJlLWpvaW5pbmcgdGliYmxlcwoKZmlyZXNfc3RhdGVzIDwtIGZpcmVzX3NtYWxsICU+JQogIGxlZnRfam9pbihzdGF0ZV9saXN0LCBieSA9ICJzdGF0ZSIpCmBgYAoKCiMjIyBOb3JtYWxpc2luZyBTdGF0ZXMgYXJlYSBzaXplcwoKYGBge3J9CmZpcmVzX3N0YXRlcyAlPiUKICBzZWxlY3QocmVnaW9uLCBhcmVhKSAlPiUKICBncm91cF9ieShyZWdpb24sIGFyZWEpICU+JQogIHN1bW1hcmlzZShudW1fZmlyZXMgPSBuKCkpICU+JQogIG11dGF0ZShmaXJlc19zcW1pbGUgPSBudW1fZmlyZXMgLyBhcmVhKSAlPiUKICBhcnJhbmdlKGRlc2MoZmlyZXNfc3FtaWxlKSkKYGBgCgojIyMjIFRoaXMgdGFibGUgc2hvd3MgUHVlcnRvIFJpY28gaGFzIHRoZSBoaWdoZXN0IHByb3BvcnRpb24gb2YgZmlyZXMgY29tcGFyZWQgdG8gaXRzIHNpemUsIGZvbGxvd2VkIGJ5IE5ldyBKZXJzZXkgaW4gdGhlIE5FIG9mIHRoZSBjb3VudHJ5IGFuZCBmaW5hbGx5IGJ5IHRoZSBTdGF0ZXMgaW4gdGhlIFNFIG9mIHRoZSBjb3VudHJ5LgoKCmBgYHtyfQpmaXJlc19zdGF0ZXMgJT4lCiAgc2VsZWN0KHJlZ2lvbiwgYXJlYSkgJT4lCiAgZ3JvdXBfYnkocmVnaW9uLCBhcmVhKSAlPiUKICBzdW1tYXJpc2UobnVtX2ZpcmVzID0gbigpKSAlPiUKICBtdXRhdGUoZmlyZXNfc3FtaWxlID0gbnVtX2ZpcmVzIC8gYXJlYSkgJT4lCiAgcmlnaHRfam9pbihzdGF0ZV9tYXAsIGJ5ID0gInJlZ2lvbiIpICU+JQogIGdncGxvdCArCiAgKGFlcyh4ID0gbG9uZywgeSA9IGxhdCwgZ3JvdXAgPSBncm91cCwgZmlsbCA9IGZpcmVzX3NxbWlsZSkpICsgCiAgZ2VvbV9wb2x5Z29uKCkgKyAKICBnZW9tX3BhdGgoY29sb3IgPSAid2hpdGUiKSArIAogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKG5hbWUgPSAiRmlyZSBwZXIgU3EgTWlsZSIsIHBhbGV0dGUgPSAiUHVCdUduIikgKwogIHRoZW1lX21hcCgpICsgCiAgY29vcmRfbWFwKCJtb2xsd2VpZGUiKSArIAogIGdndGl0bGUocGFzdGUwKCJUb3RhbCBVUyBXaWxkZmlyZXMgcGVyIFNxdWFyZSBNaWxlIGZyb20gMTk5Mi0yMDE1IikpICsgCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCmBgYAoKKipQdWVydG8gUmljbyBpcyBub3Qgc2hvd24gb24gdGhpcyBtYXAsIGJ1dCB2aXN1YWxseSB3ZSBjYW4gc2VlIHRoZSBkYXRhIGZvciB0aGUgb3RoZXIgNTEgZW50cmllcywgYW5kIHRoZSBzb3V0aCBlYXN0ZXJuIHN0YXRlcyBzdGlsbCBoYXZlIHRoZSBoaWdoZXN0IHByb3BvcnRpb24gb2Ygd2lsZGZpcmVzLiAgSW50ZXJlc3RpbmdseSBOZXcgSmVyc2V5IGFsc28gc2hvd3MgaGFzIGEgaG90c3BvdCBpbiB0aGUgTkUgb2YgdGhlIGNvdW50cnkuKioKCgojIyMgRG8gY2F1c2VzIGNoYW5nZSBvdmVyIHRpbWU/CgoKIyMjIyBTcGxpdHRpbmcgY2F1c2VzIGludG8gMiBncm91cCBmb3IgbGVnaWJpbGl0eS4gCgojIyMjIFRoZSBmaXJzdCBncm91cCBpcyBmb3IgZGlyZWN0bHkgbWFuIGNyZWF0ZWQgZmlyZXMuCgpgYGB7cn0KZmlyZXNfc3RhdGVzICU+JQogIHNlbGVjdChzdGF0X2NhdXNlX2Rlc2NyLCBmaXJlX3llYXIpICU+JQogIGdyb3VwX2J5KGZpcmVfeWVhciwgc3RhdF9jYXVzZV9kZXNjcikgJT4lCiAgZmlsdGVyKHN0YXRfY2F1c2VfZGVzY3IgPT0gIkFyc29uIiB8IHN0YXRfY2F1c2VfZGVzY3IgPT0gIkNhbXBmaXJlIiB8CiAgICAgICAgICAgc3RhdF9jYXVzZV9kZXNjciA9PSAiQ2hpbGRyZW4iIHwgc3RhdF9jYXVzZV9kZXNjciA9PSAiRXF1aXBtZW50IFVzZSIgfAogICAgICAgICAgIHN0YXRfY2F1c2VfZGVzY3IgPT0gIkZpcmV3b3JrcyIgfCBzdGF0X2NhdXNlX2Rlc2NyID09ICJTbW9raW5nIikgJT4lCiAgc3VtbWFyaXNlKG51bV9maXJlcyA9IG4oKSkgJT4lCiAgZ2dwbG90ICsKICBhZXMoeCA9IGZpcmVfeWVhciwgeSA9IG51bV9maXJlcywgY29sb3VyID0gc3RhdF9jYXVzZV9kZXNjcikgKwogIGdlb21fbGluZSgpCmBgYAoKKipUaGUgMiBsYXJnZSBwZWFrcyBpbiBBcnNvbiBhcmUgb2J2aW91cyBpbiAxOTk5IGFuZCAyMDA2LiBUaGVyZSB3YXMgYSBsYXJnZSBoZWF0d2F2ZSBpbiAyMDA2LCBidXQgSSdtIG5vdCBzdXJlIHdoeSB0aGlzIHdvdWxkIHJlc3VsdCBpbiBhbiBpbmNyZWFzZSBpbiBhcnNvbi4gIFVubGVzcyB0aGlzIHdhcyBqdXN0IGR1ZSB0byB0aGUgZHJ5IGdyb3VuZCBjcmVhdGluZyBleHRyYSBmdWVsIHRvIGFpZCB0aGUgc3ByZWFkIG9mIGZpcmVzIHRoYXQgd291bGQgaGF2ZSBub3JtYWxseSBub3QgcmVzdWx0ZWQgaW4gYSBsYXJnZSBzY2FsZSBmaXJlLiAgVGhpcyBtYXkgYWxzbyBiZSB0aGUgc2FtZSByZWFzb24gdGhhdCB0aGVyZSBpcyBhbHNvIGFub3RoZXIgcGVhayBpbiAyMDA2IGZvciBFcXVpcG1lbnQgVXNlLiAgQXJzb24gaG93ZXZlciBkb2VzIGxvb2sgdG8gYmUgZGVjcmVhc2luZyBzaW5jZSAyMDA2LioqCgoKIyMjIyBBbmQgdGhpcyBvbmUgZm9yIG5hdHVyYWwgb2NjdXJpbmcgZmlyZXMuCgpgYGB7cn0KZmlyZXNfc3RhdGVzICU+JQogIHNlbGVjdChzdGF0X2NhdXNlX2Rlc2NyLCBmaXJlX3llYXIpICU+JQogIGdyb3VwX2J5KGZpcmVfeWVhciwgc3RhdF9jYXVzZV9kZXNjcikgJT4lCiAgZmlsdGVyKHN0YXRfY2F1c2VfZGVzY3IgPT0gIkRlYnJpcyBCdXJuaW5nIiB8IHN0YXRfY2F1c2VfZGVzY3IgPT0gIkxpZ2h0bmluZyIgfAogICAgICAgICAgIHN0YXRfY2F1c2VfZGVzY3IgPT0gIk1pc2NlbGxhbmVvdXMiIHwgc3RhdF9jYXVzZV9kZXNjciA9PSAKICAgICAgICAgICAiTWlzc2luZy9VbmRlZmluZWQiIHwgc3RhdF9jYXVzZV9kZXNjciA9PSAiUG93ZXJsaW5lIiB8IAogICAgICAgICAgIHN0YXRfY2F1c2VfZGVzY3IgPT0gIlJhaWxyb2FkIiB8IHN0YXRfY2F1c2VfZGVzY3IgPT0gIlN0cnVjdHVyZSIpICU+JQogIHN1bW1hcmlzZShudW1fZmlyZXMgPSBuKCkpICU+JQogIGdncGxvdCArCiAgYWVzKHggPSBmaXJlX3llYXIsIHkgPSBudW1fZmlyZXMsIGNvbG91ciA9IHN0YXRfY2F1c2VfZGVzY3IpICsKICBnZW9tX2xpbmUoKQpgYGAKCioqU2ltaWxhciBwZWFrcyBjYW4gYmUgc2VlbiBpbiBEZWJyaXMsIE1pc2NlbGxhbmVvdXMgYW5kIGxpZ2h0bmluZyBpbiB0aGUgaGVhdHdhdmUgb2YgMjAwNiB0aGF0IGxlZnQgdGhlIGdyb3VuZCB2ZXJ5IGRyeS4gIFRoZXJlIGFyZSBwZWFrcyBmcm9tIDE5OTcgdG8gMjAwMyBpbiBkZWJyaXMsIG1pc2NlbGxhbmVvdXMgYW5kIGxpZ2h0ZW5pbmcsIGJ1dCBhbHNvIGEgdHJvdWdoIGluIG1pc3NpbmcvdW5kZWZpbmVkLCBzbyB0aGlzIGlzIGxpa2VseSB0byBiZSBkdWUgdG8gbW9yZSBhY2N1cmF0ZSBjbGFzc2lmaWNhdGlvbiBvZiBmaXJlcyBhbmQgbm90IHVzaW5nIHRoZSBtaXNzaW5nL3VuZGVmaW5lZCBjYXRlZ29yeSBhcyBtdWNoLioqCgoKCiMjIyBEaWZmZXJlbmNlIGluIGNhdXNlcyBiZXR3ZWVuIHN0YXRlcwoKCmBgYHtyfQpzdGF0ZV9tYXBfc291dGhlcm4gPC0gc3RhdGVfbWFwICU+JQogIGZpbHRlcihyZWdpb24gPT0gImZsb3JpZGEiIHwgcmVnaW9uID09ICJnZW9yZ2lhIiB8IHJlZ2lvbiA9PSAiYWxhYmFtYSIgfAogICAgICAgICAgIHJlZ2lvbiA9PSAibWlzc2lzc2lwcGkiIHwgcmVnaW9uID09ICJzb3V0aCBjYXJvbGluYSIgfCAKICAgICAgICAgICByZWdpb24gPT0gIm5vcnRoIGNhcm9saW5hIiB8IHJlZ2lvbiA9PSAidGVubmVzc2VlIiB8IAogICAgICAgICAgIHJlZ2lvbiA9PSAiYXJrYW5zYXMiIHwgcmVnaW9uID09ICJsb3Vpc2lhbmEiKQpgYGAKCgpgYGB7cn0KZmlyZXNfc3RhdGVzICU+JQogIGZpbHRlcihmaXJlX3llYXIgPT0gIjE5OTIiIHwgZmlyZV95ZWFyID09ICIxOTkzIiB8IGZpcmVfeWVhciA9PSAiMTk5NCIgfAogICAgICAgICAgIGZpcmVfeWVhciA9PSAiMTk5NSIpICU+JQogIGZpbHRlcihyZWdpb24gPT0gImZsb3JpZGEiIHwgcmVnaW9uID09ICJnZW9yZ2lhIiB8IHJlZ2lvbiA9PSAiYWxhYmFtYSIgfAogICAgICAgICAgIHJlZ2lvbiA9PSAibWlzc2lzc2lwcGkiIHwgcmVnaW9uID09ICJzb3V0aCBjYXJvbGluYSIgfCAKICAgICAgICAgICByZWdpb24gPT0gIm5vcnRoIGNhcm9saW5hIiB8IHJlZ2lvbiA9PSAidGVubmVzc2VlIiB8CiAgICAgICAgICAgcmVnaW9uID09ICJhcmthbnNhcyIgfCByZWdpb24gPT0gImxvdWlzaWFuYSIpICU+JQogIHNlbGVjdChyZWdpb24sIHN0YXRfY2F1c2VfZGVzY3IpICU+JQogIGdyb3VwX2J5KHJlZ2lvbiwgc3RhdF9jYXVzZV9kZXNjcikgJT4lCiAgc3VtbWFyaXNlKG51bV9maXJlID0gbigpKSAlPiUKICB0b3BfbigxKSAlPiUKICByaWdodF9qb2luKHN0YXRlX21hcF9zb3V0aGVybiwgYnkgPSAicmVnaW9uIikgJT4lCiAgZ2dwbG90ICsKICAoYWVzKHggPSBsb25nLCB5ID0gbGF0LCBncm91cCA9IGdyb3VwLCBmaWxsID0gc3RhdF9jYXVzZV9kZXNjcikpICsgCiAgZ2VvbV9wb2x5Z29uKCkgKyAKICBnZW9tX3BhdGgoY29sb3IgPSAid2hpdGUiKSArIAogIHRoZW1lX21hcCgpICsgCiAgc2NhbGVfZmlsbF9icmV3ZXIobmFtZSA9ICJDYXVzZSBvZiBGaXJlcyIsIHBhbGV0dGUgPSAiUHVCdUduIikgKwogIGdndGl0bGUoIlRvdGFsIFVTIFdpbGRmaXJlcyBtYWluIGNhdXNlIGZyb20gMTk5Mi0xOTk1IikgKyAKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKYGBgCgpgYGB7cn0KZ2dzYXZlKCIxOTkyLTE5OTUucG5nIikKYGBgCgoKYGBge3J9CmZpcmVzX3N0YXRlcyAlPiUKICBmaWx0ZXIoZmlyZV95ZWFyID09ICIxOTk2IiB8IGZpcmVfeWVhciA9PSAiMTk5NyIgfCBmaXJlX3llYXIgPT0gIjE5OTgiIHwKICAgICAgICAgICBmaXJlX3llYXIgPT0gIjE5OTkiKSAlPiUKICBmaWx0ZXIocmVnaW9uID09ICJmbG9yaWRhIiB8IHJlZ2lvbiA9PSAiZ2VvcmdpYSIgfCByZWdpb24gPT0gImFsYWJhbWEiIHwKICAgICAgICAgICByZWdpb24gPT0gIm1pc3Npc3NpcHBpIiB8IHJlZ2lvbiA9PSAic291dGggY2Fyb2xpbmEiIHwgCiAgICAgICAgICAgcmVnaW9uID09ICJub3J0aCBjYXJvbGluYSIgfCByZWdpb24gPT0gInRlbm5lc3NlZSIgfAogICAgICAgICAgIHJlZ2lvbiA9PSAiYXJrYW5zYXMiIHwgcmVnaW9uID09ICJsb3Vpc2lhbmEiKSAlPiUKICBzZWxlY3QocmVnaW9uLCBzdGF0X2NhdXNlX2Rlc2NyKSAlPiUKICBncm91cF9ieShyZWdpb24sIHN0YXRfY2F1c2VfZGVzY3IpICU+JQogIHN1bW1hcmlzZShudW1fZmlyZSA9IG4oKSkgJT4lCiAgdG9wX24oMSkgJT4lCiAgcmlnaHRfam9pbihzdGF0ZV9tYXBfc291dGhlcm4sIGJ5ID0gInJlZ2lvbiIpICU+JQogIGdncGxvdCArCiAgKGFlcyh4ID0gbG9uZywgeSA9IGxhdCwgZ3JvdXAgPSBncm91cCwgZmlsbCA9IHN0YXRfY2F1c2VfZGVzY3IpKSArIAogIGdlb21fcG9seWdvbigpICsgCiAgZ2VvbV9wYXRoKGNvbG9yID0gIndoaXRlIikgKyAKICB0aGVtZV9tYXAoKSArIAogIHNjYWxlX2ZpbGxfYnJld2VyKG5hbWUgPSAiQ2F1c2Ugb2YgRmlyZXMiLCBwYWxldHRlID0gIlB1QnVHbiIpICsKICBnZ3RpdGxlKCJUb3RhbCBVUyBXaWxkZmlyZXMgbWFpbiBjYXVzZSBmcm9tIDE5OTYtMTk5OSIpICsgCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCmBgYAoKYGBge3J9Cmdnc2F2ZSgiMTk5Ni0xOTk5LnBuZyIpCmBgYAoKCgpgYGB7cn0KZmlyZXNfc3RhdGVzICU+JQogIGZpbHRlcihmaXJlX3llYXIgPT0gIjIwMDAiIHwgZmlyZV95ZWFyID09ICIyMDAxIiB8IGZpcmVfeWVhciA9PSAiMjAwMiIgfAogICAgICAgICAgIGZpcmVfeWVhciA9PSAiMjAwMyIpICU+JQogIGZpbHRlcihyZWdpb24gPT0gImZsb3JpZGEiIHwgcmVnaW9uID09ICJnZW9yZ2lhIiB8IHJlZ2lvbiA9PSAiYWxhYmFtYSIgfAogICAgICAgICAgIHJlZ2lvbiA9PSAibWlzc2lzc2lwcGkiIHwgcmVnaW9uID09ICJzb3V0aCBjYXJvbGluYSIgfCAKICAgICAgICAgICByZWdpb24gPT0gIm5vcnRoIGNhcm9saW5hIiB8IHJlZ2lvbiA9PSAidGVubmVzc2VlIiB8CiAgICAgICAgICAgcmVnaW9uID09ICJhcmthbnNhcyIgfCByZWdpb24gPT0gImxvdWlzaWFuYSIpICU+JQogIHNlbGVjdChyZWdpb24sIHN0YXRfY2F1c2VfZGVzY3IpICU+JQogIGdyb3VwX2J5KHJlZ2lvbiwgc3RhdF9jYXVzZV9kZXNjcikgJT4lCiAgc3VtbWFyaXNlKG51bV9maXJlID0gbigpKSAlPiUKICB0b3BfbigxKSAlPiUKICByaWdodF9qb2luKHN0YXRlX21hcF9zb3V0aGVybiwgYnkgPSAicmVnaW9uIikgJT4lCiAgZ2dwbG90ICsKICAoYWVzKHggPSBsb25nLCB5ID0gbGF0LCBncm91cCA9IGdyb3VwLCBmaWxsID0gc3RhdF9jYXVzZV9kZXNjcikpICsgCiAgZ2VvbV9wb2x5Z29uKCkgKyAKICBnZW9tX3BhdGgoY29sb3IgPSAid2hpdGUiKSArIAogIHRoZW1lX21hcCgpICsgCiAgc2NhbGVfZmlsbF9icmV3ZXIobmFtZSA9ICJDYXVzZSBvZiBGaXJlcyIsIHBhbGV0dGUgPSAiUHVCdUduIikgKwogIGdndGl0bGUoIlRvdGFsIFVTIFdpbGRmaXJlcyBtYWluIGNhdXNlIGZyb20gMjAwMC0yMDAzIikgKyAKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKYGBgCgpgYGB7cn0KZ2dzYXZlKCIyMDAwLTIwMDMucG5nIikKYGBgCgoKCmBgYHtyfQpmaXJlc19zdGF0ZXMgJT4lCiAgZmlsdGVyKGZpcmVfeWVhciA9PSAiMjAwNCIgfCBmaXJlX3llYXIgPT0gIjIwMDUiIHwgZmlyZV95ZWFyID09ICIyMDA2IiB8CiAgICAgICAgICAgZmlyZV95ZWFyID09ICIyMDA3IikgJT4lCiAgZmlsdGVyKHJlZ2lvbiA9PSAiZmxvcmlkYSIgfCByZWdpb24gPT0gImdlb3JnaWEiIHwgcmVnaW9uID09ICJhbGFiYW1hIiB8CiAgICAgICAgICAgcmVnaW9uID09ICJtaXNzaXNzaXBwaSIgfCByZWdpb24gPT0gInNvdXRoIGNhcm9saW5hIiB8IAogICAgICAgICAgIHJlZ2lvbiA9PSAibm9ydGggY2Fyb2xpbmEiIHwgcmVnaW9uID09ICJ0ZW5uZXNzZWUiIHwKICAgICAgICAgICByZWdpb24gPT0gImFya2Fuc2FzIiB8IHJlZ2lvbiA9PSAibG91aXNpYW5hIikgJT4lCiAgc2VsZWN0KHJlZ2lvbiwgc3RhdF9jYXVzZV9kZXNjcikgJT4lCiAgZ3JvdXBfYnkocmVnaW9uLCBzdGF0X2NhdXNlX2Rlc2NyKSAlPiUKICBzdW1tYXJpc2UobnVtX2ZpcmUgPSBuKCkpICU+JQogIHRvcF9uKDEpICU+JQogIHJpZ2h0X2pvaW4oc3RhdGVfbWFwX3NvdXRoZXJuLCBieSA9ICJyZWdpb24iKSAlPiUKICBnZ3Bsb3QgKwogIChhZXMoeCA9IGxvbmcsIHkgPSBsYXQsIGdyb3VwID0gZ3JvdXAsIGZpbGwgPSBzdGF0X2NhdXNlX2Rlc2NyKSkgKyAKICBnZW9tX3BvbHlnb24oKSArIAogIGdlb21fcGF0aChjb2xvciA9ICJ3aGl0ZSIpICsgCiAgdGhlbWVfbWFwKCkgKyAKICBzY2FsZV9maWxsX2JyZXdlcihuYW1lID0gIkNhdXNlIG9mIEZpcmVzIiwgcGFsZXR0ZSA9ICJQdUJ1R24iKSArCiAgZ2d0aXRsZSgiVG90YWwgVVMgV2lsZGZpcmVzIG1haW4gY2F1c2UgZnJvbSAyMDA0LTIwMDciKSArIAogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQpgYGAKCmBgYHtyfQpnZ3NhdmUoIjIwMDQtMjAwNy5wbmciKQpgYGAKCgoKCmBgYHtyfQpmaXJlc19zdGF0ZXMgJT4lCiAgZmlsdGVyKGZpcmVfeWVhciA9PSAiMjAwOCIgfCBmaXJlX3llYXIgPT0gIjIwMDkiIHwgZmlyZV95ZWFyID09ICIyMDEwIiB8CiAgICAgICAgICAgZmlyZV95ZWFyID09ICIyMDExIikgJT4lCiAgZmlsdGVyKHJlZ2lvbiA9PSAiZmxvcmlkYSIgfCByZWdpb24gPT0gImdlb3JnaWEiIHwgcmVnaW9uID09ICJhbGFiYW1hIiB8CiAgICAgICAgICAgcmVnaW9uID09ICJtaXNzaXNzaXBwaSIgfCByZWdpb24gPT0gInNvdXRoIGNhcm9saW5hIiB8IAogICAgICAgICAgIHJlZ2lvbiA9PSAibm9ydGggY2Fyb2xpbmEiIHwgcmVnaW9uID09ICJ0ZW5uZXNzZWUiIHwKICAgICAgICAgICByZWdpb24gPT0gImFya2Fuc2FzIiB8IHJlZ2lvbiA9PSAibG91aXNpYW5hIikgJT4lCiAgc2VsZWN0KHJlZ2lvbiwgc3RhdF9jYXVzZV9kZXNjcikgJT4lCiAgZ3JvdXBfYnkocmVnaW9uLCBzdGF0X2NhdXNlX2Rlc2NyKSAlPiUKICBzdW1tYXJpc2UobnVtX2ZpcmUgPSBuKCkpICU+JQogIHRvcF9uKDEpICU+JQogIHJpZ2h0X2pvaW4oc3RhdGVfbWFwX3NvdXRoZXJuLCBieSA9ICJyZWdpb24iKSAlPiUKICBnZ3Bsb3QgKwogIChhZXMoeCA9IGxvbmcsIHkgPSBsYXQsIGdyb3VwID0gZ3JvdXAsIGZpbGwgPSBzdGF0X2NhdXNlX2Rlc2NyKSkgKyAKICBnZW9tX3BvbHlnb24oKSArIAogIGdlb21fcGF0aChjb2xvciA9ICJ3aGl0ZSIpICsgCiAgdGhlbWVfbWFwKCkgKyAKICBzY2FsZV9maWxsX2JyZXdlcihuYW1lID0gIkNhdXNlIG9mIEZpcmVzIiwgcGFsZXR0ZSA9ICJQdUJ1R24iKSArCiAgZ2d0aXRsZSgiVG90YWwgVVMgV2lsZGZpcmVzIG1haW4gY2F1c2UgZnJvbSAyMDA4LTIwMTEiKSArIAogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQpgYGAKCmBgYHtyfQpnZ3NhdmUoIjIwMDgtMjAxMS5wbmciKQpgYGAKCgoKYGBge3J9CmZpcmVzX3N0YXRlcyAlPiUKICBmaWx0ZXIoZmlyZV95ZWFyID09ICIyMDEyIiB8IGZpcmVfeWVhciA9PSAiMjAxMyIgfCBmaXJlX3llYXIgPT0gIjIwMTQiIHwKICAgICAgICAgICBmaXJlX3llYXIgPT0gIjIwMTUiKSAlPiUKICBmaWx0ZXIocmVnaW9uID09ICJmbG9yaWRhIiB8IHJlZ2lvbiA9PSAiZ2VvcmdpYSIgfCByZWdpb24gPT0gImFsYWJhbWEiIHwKICAgICAgICAgICByZWdpb24gPT0gIm1pc3Npc3NpcHBpIiB8IHJlZ2lvbiA9PSAic291dGggY2Fyb2xpbmEiIHwgCiAgICAgICAgICAgcmVnaW9uID09ICJub3J0aCBjYXJvbGluYSIgfCByZWdpb24gPT0gInRlbm5lc3NlZSIgfAogICAgICAgICAgIHJlZ2lvbiA9PSAiYXJrYW5zYXMiIHwgcmVnaW9uID09ICJsb3Vpc2lhbmEiKSAlPiUKICBzZWxlY3QocmVnaW9uLCBzdGF0X2NhdXNlX2Rlc2NyKSAlPiUKICBncm91cF9ieShyZWdpb24sIHN0YXRfY2F1c2VfZGVzY3IpICU+JQogIHN1bW1hcmlzZShudW1fZmlyZSA9IG4oKSkgJT4lCiAgdG9wX24oMSkgJT4lCiAgcmlnaHRfam9pbihzdGF0ZV9tYXBfc291dGhlcm4sIGJ5ID0gInJlZ2lvbiIpICU+JQogIGdncGxvdCArCiAgKGFlcyh4ID0gbG9uZywgeSA9IGxhdCwgZ3JvdXAgPSBncm91cCwgZmlsbCA9IHN0YXRfY2F1c2VfZGVzY3IpKSArIAogIGdlb21fcG9seWdvbigpICsgCiAgZ2VvbV9wYXRoKGNvbG9yID0gIndoaXRlIikgKyAKICB0aGVtZV9tYXAoKSArIAogIHNjYWxlX2ZpbGxfYnJld2VyKG5hbWUgPSAiQ2F1c2Ugb2YgRmlyZXMiLCBwYWxldHRlID0gIlB1QnVHbiIpICsKICBnZ3RpdGxlKCJUb3RhbCBVUyBXaWxkZmlyZXMgbWFpbiBjYXVzZSBmcm9tIDIwMTItMjAxNSIpICsgCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCmBgYAoKYGBge3J9Cmdnc2F2ZSgiMjAxMi0yMDE1LnBuZyIpCmBgYAoKKipMb29raW5nIGF0IHRoZXNlIHRyZW5kcyBzb21lIGludGVyZXN0aW5nIGluc2lnaHRzIGNhbiBiZSBzZWVuLiAgRm9yIHRoZSBjb21iaW5lZCB5ZWFycyBkYXRhIEZsb3JpZGEgc3RhbmRzIG91dCBhcyBoYXZpbmcgcmFpbHJvYWQgYXMgaXRzIG1haW4gY2F1c2Ugb2Ygd2lsZGZpcmUsIGJ1dCBmcm9tIHRoZSBhYm92ZSBwbG90cyBpdCBjYW4gYmUgc2VlbiB0aGF0IHRoZXNlIHJhaWxyb2FkIGZpcmVzIGFyZSBvbmx5IHRoZSBtYWluIGNhdXNlIHVwIHRvIHRoZSA0IHllYXJseSBwZXJpb2QgZW5kaW5nIGluIDIwMDMgYW5kIHRoZW4gdGhlIG1haW4gY2F1c2UgY2hhbmdlcyB0byBsaWdodG5pbmcgdW50aWwgdGhlIGVuZCBvZiB0aGUgY29sbGVjdGlvbiBwZXJpb2QgaW4gMjAxNS4gIFNpbWlsYXJseSBhcnNvbiBzZWVtIHJlYXNvbmFibHkgcG9wdWxhciBpbiB0aGUgc291dGhlcm4gc3RhdGVzIHVudGlsIDIwMDcsIHdoZW4gaXQgbm8gbG9uZ2VyIGFwcGVhcnMgYXMgdGhlIG1vc3QgY29tbW9uIGNhdXNlIG9mIHdpbGRmaXJlLiAgVGhpcyBkb3dud2FyZCB0cmVuZCB3YXMgYWxzbyBub3RlZCBlYXJsaWVyIGluIHRoZSBvdmVyYWxsIGNhdXNhdGlvbiBwbG90cyBmb3IgYWxsIHN0YXRlcyoqCgoKCiMjIyBDb3JyZWxhdGlvbiBiZXR3ZWVuIHN0YXRlcyBhbmQgZmlyZSBzaXplCgpgYGB7cn0KZmlyZXNfc3RhdGVzICU+JQogIHNlbGVjdChyZWdpb24sIGZpcmVfc2l6ZV9jbGFzcykgJT4lCiAgZ3JvdXBfYnkocmVnaW9uLCBmaXJlX3NpemVfY2xhc3MpICU+JQogIHN1bW1hcmlzZShudW1fZmlyZSA9IG4oKSkgJT4lCiAgdG9wX24oMSkgJT4lCiAgcmlnaHRfam9pbihzdGF0ZV9tYXAsIGJ5ID0gInJlZ2lvbiIpICU+JQogIGdncGxvdCArCiAgKGFlcyh4ID0gbG9uZywgeSA9IGxhdCwgZ3JvdXAgPSBncm91cCwgZmlsbCA9IGZpcmVfc2l6ZV9jbGFzcykpICsKICBnZW9tX3BvbHlnb24oKSArCiAgZ2VvbV9wYXRoKGNvbG9yID0gIndoaXRlIikgKwogIHRoZW1lX21hcCgpICsKICBzY2FsZV9maWxsX2JyZXdlcihuYW1lID0gIkZpcmUgU2l6ZSBDbGFzcyIsIHBhbGV0dGUgPSAiUHVCdUduIikgKwogIGdndGl0bGUoIk1vc3QgY29tbW9uIHdpbGRmaXJlIHNpemUgcGVyIFN0YXRlIDE5OTItMjAxNSIpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKYGBgCgoKYGBge3J9CmZpcmVzX3N0YXRlcyAlPiUKICBzZWxlY3QocmVnaW9uLCBmaXJlX3NpemVfY2xhc3MpICU+JQogIGZpbHRlcihmaXJlX3NpemVfY2xhc3MgPT0gIkciKSAlPiUKICBncm91cF9ieShyZWdpb24pICU+JQogIHN1bW1hcmlzZShudW1fZmlyZSA9IG4oKSkgJT4lCiAgcmlnaHRfam9pbihzdGF0ZV9tYXAsIGJ5ID0gInJlZ2lvbiIpICU+JQogIGdncGxvdCArCiAgKGFlcyh4ID0gbG9uZywgeSA9IGxhdCwgZ3JvdXAgPSBncm91cCwgZmlsbCA9IG51bV9maXJlKSkgKwogIGdlb21fcG9seWdvbigpICsKICBnZW9tX3BhdGgoY29sb3IgPSAid2hpdGUiKSArCiAgdGhlbWVfbWFwKCkgKwogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKG5hbWUgPSAiTnVtYmVyIG9mIEZpcmVzIiwgcGFsZXR0ZSA9ICJQdUJ1R24iKSArCiAgZ2d0aXRsZSgiTnVtYmVyIG9mIGxhcmdlIGNsYXNzIEcgZmlyZXMgcGVyIFN0YXRlIDE5OTItMjAxNSIpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKYGBgCgoqKkZyb20gdGhlIHBsb3RzIHdlIGNhbiBzZWUgdGhhdCB0aGUgV2VzdGVybiBzdGF0ZXMgaGF2ZSB0aGUgbW9zdCBzbWFsbCBmaXJlcyBhbmQgYWxzbyB0aGUgbW9zdCBsYXJnZSBmaXJlcyEgIE5vdCBlbnRpcmVseSB0aGUgbW9zdCBoZWxwZnVsIHBsb3RzLi4uKioKCgoKIyMjIEFyZSBmaXJlcyBtb3JlIHByZXZhbGVudCBpbiBjZXJ0YWluIG1vbnRocyBmb3IgaW5kaXZpZHVhbCBzdGF0ZXMKCmBgYHtyfQpmaXJlc19zdGF0ZXMgJT4lCiAgZmlsdGVyKGZpcmVfeWVhciA9PSAiMTk5MiIgfCBmaXJlX3llYXIgPT0gIjE5OTMiIHwgZmlyZV95ZWFyID09ICIxOTk0IiB8CiAgICAgICAgICAgZmlyZV95ZWFyID09ICIxOTk1IikgJT4lCiAgc2VsZWN0KHJlZ2lvbiwgZGlzY292ZXJ5X21veSkgJT4lCiAgZ3JvdXBfYnkocmVnaW9uLCBkaXNjb3ZlcnlfbW95KSAlPiUKICBzdW1tYXJpc2UobnVtX2ZpcmUgPSBuKCkpICU+JQogIHRvcF9uKDEpICU+JQogIHJpZ2h0X2pvaW4oc3RhdGVfbWFwLCBieSA9ICJyZWdpb24iKSAlPiUKICBnZ3Bsb3QgKwogIChhZXMoeCA9IGxvbmcsIHkgPSBsYXQsIGdyb3VwID0gZ3JvdXAsIGZpbGwgPSBkaXNjb3ZlcnlfbW95KSkgKwogIGdlb21fcG9seWdvbigpICsKICBnZW9tX3BhdGgoY29sb3IgPSAid2hpdGUiKSArCiAgdGhlbWVfbWFwKCkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKG5hbWUgPSAiTW9udGhzIG9mIFllYXIiLCBwYWxldHRlID0gIlB1QnVHbiIpICsKICBnZ3RpdGxlKCJNb250aCB3aXRoIG1vc3QgZmlyZXMgcGVyIFN0YXRlIDE5OTItMTk5NSIpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKYGBgCgoKCmBgYHtyfQpmaXJlc19zdGF0ZXMgJT4lCiAgZmlsdGVyKGZpcmVfeWVhciA9PSAiMTk5NiIgfCBmaXJlX3llYXIgPT0gIjE5OTciIHwgZmlyZV95ZWFyID09ICIxOTk4IiB8CiAgICAgICAgICAgZmlyZV95ZWFyID09ICIxOTk5IikgJT4lCiAgc2VsZWN0KHJlZ2lvbiwgZGlzY292ZXJ5X21veSkgJT4lCiAgZ3JvdXBfYnkocmVnaW9uLCBkaXNjb3ZlcnlfbW95KSAlPiUKICBzdW1tYXJpc2UobnVtX2ZpcmUgPSBuKCkpICU+JQogIHRvcF9uKDEpICU+JQogIHJpZ2h0X2pvaW4oc3RhdGVfbWFwLCBieSA9ICJyZWdpb24iKSAlPiUKICBnZ3Bsb3QgKwogIChhZXMoeCA9IGxvbmcsIHkgPSBsYXQsIGdyb3VwID0gZ3JvdXAsIGZpbGwgPSBkaXNjb3ZlcnlfbW95KSkgKwogIGdlb21fcG9seWdvbigpICsKICBnZW9tX3BhdGgoY29sb3IgPSAid2hpdGUiKSArCiAgdGhlbWVfbWFwKCkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKG5hbWUgPSAiTW9udGhzIG9mIFllYXIiLCBwYWxldHRlID0gIlB1QnVHbiIpICsKICBnZ3RpdGxlKCJNb250aCB3aXRoIG1vc3QgZmlyZXMgcGVyIFN0YXRlIDE5OTYtMTk5OSIpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKYGBgCgoKYGBge3J9CmZpcmVzX3N0YXRlcyAlPiUKICBmaWx0ZXIoZmlyZV95ZWFyID09ICIyMDAwIiB8IGZpcmVfeWVhciA9PSAiMjAwMSIgfCBmaXJlX3llYXIgPT0gIjIwMDIiIHwKICAgICAgICAgICBmaXJlX3llYXIgPT0gIjIwMDMiKSAlPiUKICBzZWxlY3QocmVnaW9uLCBkaXNjb3ZlcnlfbW95KSAlPiUKICBncm91cF9ieShyZWdpb24sIGRpc2NvdmVyeV9tb3kpICU+JQogIHN1bW1hcmlzZShudW1fZmlyZSA9IG4oKSkgJT4lCiAgdG9wX24oMSkgJT4lCiAgcmlnaHRfam9pbihzdGF0ZV9tYXAsIGJ5ID0gInJlZ2lvbiIpICU+JQogIGdncGxvdCArCiAgKGFlcyh4ID0gbG9uZywgeSA9IGxhdCwgZ3JvdXAgPSBncm91cCwgZmlsbCA9IGRpc2NvdmVyeV9tb3kpKSArCiAgZ2VvbV9wb2x5Z29uKCkgKwogIGdlb21fcGF0aChjb2xvciA9ICJ3aGl0ZSIpICsKICB0aGVtZV9tYXAoKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIobmFtZSA9ICJNb250aHMgb2YgWWVhciIsIHBhbGV0dGUgPSAiUHVCdUduIikgKwogIGdndGl0bGUoIk1vbnRoIHdpdGggbW9zdCBmaXJlcyBwZXIgU3RhdGUgMjAwMC0yMDAzIikgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQpgYGAKCgpgYGB7cn0KZmlyZXNfc3RhdGVzICU+JQogIGZpbHRlcihmaXJlX3llYXIgPT0gIjIwMDQiIHwgZmlyZV95ZWFyID09ICIyMDA1IiB8IGZpcmVfeWVhciA9PSAiMjAwNiIgfAogICAgICAgICAgIGZpcmVfeWVhciA9PSAiMjAwNyIpICU+JQogIHNlbGVjdChyZWdpb24sIGRpc2NvdmVyeV9tb3kpICU+JQogIGdyb3VwX2J5KHJlZ2lvbiwgZGlzY292ZXJ5X21veSkgJT4lCiAgc3VtbWFyaXNlKG51bV9maXJlID0gbigpKSAlPiUKICB0b3BfbigxKSAlPiUKICByaWdodF9qb2luKHN0YXRlX21hcCwgYnkgPSAicmVnaW9uIikgJT4lCiAgZ2dwbG90ICsKICAoYWVzKHggPSBsb25nLCB5ID0gbGF0LCBncm91cCA9IGdyb3VwLCBmaWxsID0gZGlzY292ZXJ5X21veSkpICsKICBnZW9tX3BvbHlnb24oKSArCiAgZ2VvbV9wYXRoKGNvbG9yID0gIndoaXRlIikgKwogIHRoZW1lX21hcCgpICsKICBzY2FsZV9maWxsX2JyZXdlcihuYW1lID0gIk1vbnRocyBvZiBZZWFyIiwgcGFsZXR0ZSA9ICJQdUJ1R24iKSArCiAgZ2d0aXRsZSgiTW9udGggd2l0aCBtb3N0IGZpcmVzIHBlciBTdGF0ZSAyMDA0LTIwMDciKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCmBgYAoKCmBgYHtyfQpmaXJlc19zdGF0ZXMgJT4lCiAgZmlsdGVyKGZpcmVfeWVhciA9PSAiMjAwOCIgfCBmaXJlX3llYXIgPT0gIjIwMDkiIHwgZmlyZV95ZWFyID09ICIyMDEwIiB8CiAgICAgICAgICAgZmlyZV95ZWFyID09ICIyMDExIikgJT4lCiAgc2VsZWN0KHJlZ2lvbiwgZGlzY292ZXJ5X21veSkgJT4lCiAgZ3JvdXBfYnkocmVnaW9uLCBkaXNjb3ZlcnlfbW95KSAlPiUKICBzdW1tYXJpc2UobnVtX2ZpcmUgPSBuKCkpICU+JQogIHRvcF9uKDEpICU+JQogIHJpZ2h0X2pvaW4oc3RhdGVfbWFwLCBieSA9ICJyZWdpb24iKSAlPiUKICBnZ3Bsb3QgKwogIChhZXMoeCA9IGxvbmcsIHkgPSBsYXQsIGdyb3VwID0gZ3JvdXAsIGZpbGwgPSBkaXNjb3ZlcnlfbW95KSkgKwogIGdlb21fcG9seWdvbigpICsKICBnZW9tX3BhdGgoY29sb3IgPSAid2hpdGUiKSArCiAgdGhlbWVfbWFwKCkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKG5hbWUgPSAiTW9udGhzIG9mIFllYXIiLCBwYWxldHRlID0gIlB1QnVHbiIpICsKICBnZ3RpdGxlKCJNb250aCB3aXRoIG1vc3QgZmlyZXMgcGVyIFN0YXRlIDIwMDgtMjAxMSIpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKYGBgCgoKYGBge3J9CmZpcmVzX3N0YXRlcyAlPiUKICBmaWx0ZXIoZmlyZV95ZWFyID09ICIyMDEyIiB8IGZpcmVfeWVhciA9PSAiMjAxMyIgfCBmaXJlX3llYXIgPT0gIjIwMTQiIHwKICAgICAgICAgICBmaXJlX3llYXIgPT0gIjIwMTUiKSAlPiUKICBzZWxlY3QocmVnaW9uLCBkaXNjb3ZlcnlfbW95KSAlPiUKICBncm91cF9ieShyZWdpb24sIGRpc2NvdmVyeV9tb3kpICU+JQogIHN1bW1hcmlzZShudW1fZmlyZSA9IG4oKSkgJT4lCiAgdG9wX24oMSkgJT4lCiAgcmlnaHRfam9pbihzdGF0ZV9tYXAsIGJ5ID0gInJlZ2lvbiIpICU+JQogIGdncGxvdCArCiAgKGFlcyh4ID0gbG9uZywgeSA9IGxhdCwgZ3JvdXAgPSBncm91cCwgZmlsbCA9IGRpc2NvdmVyeV9tb3kpKSArCiAgZ2VvbV9wb2x5Z29uKCkgKwogIGdlb21fcGF0aChjb2xvciA9ICJ3aGl0ZSIpICsKICB0aGVtZV9tYXAoKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIobmFtZSA9ICJNb250aHMgb2YgWWVhciIsIHBhbGV0dGUgPSAiUHVCdUduIikgKwogIGdndGl0bGUoIk1vbnRoIHdpdGggbW9zdCBmaXJlcyBwZXIgU3RhdGUgMjAxMi0yMDE1IikgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQpgYGAKCgpgYGB7cn0KZmlyZXNfc3RhdGVzICU+JQogIGZpbHRlcihmaXJlX3llYXIgPT0gIjIwMTAiIHwgZmlyZV95ZWFyID09ICIyMDExIiB8IGZpcmVfeWVhciA9PSAiMjAxMiIgfAogICAgICAgICAgIGZpcmVfeWVhciA9PSAiMjAxMyIgfCBmaXJlX3llYXIgPT0gIjIwMTQiIHwgZmlyZV95ZWFyID09ICIyMDE1IikgJT4lCiAgc2VsZWN0KHJlZ2lvbiwgZGlzY292ZXJ5X21veSkgJT4lCiAgZ3JvdXBfYnkocmVnaW9uLCBkaXNjb3ZlcnlfbW95KSAlPiUKICBzdW1tYXJpc2UobnVtX2ZpcmUgPSBuKCkpICU+JQogIHRvcF9uKDEpICU+JQogIHJpZ2h0X2pvaW4oc3RhdGVfbWFwLCBieSA9ICJyZWdpb24iKSAlPiUKICBnZ3Bsb3QgKwogIChhZXMoeCA9IGxvbmcsIHkgPSBsYXQsIGdyb3VwID0gZ3JvdXAsIGZpbGwgPSBkaXNjb3ZlcnlfbW95KSkgKwogIGdlb21fcG9seWdvbigpICsKICBnZW9tX3BhdGgoY29sb3IgPSAid2hpdGUiKSArCiAgdGhlbWVfbWFwKCkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKG5hbWUgPSAiTW9udGhzIG9mIFllYXIiLCBwYWxldHRlID0gIlB1QnVHbiIpICsKICBnZ3RpdGxlKCJNb250aCB3aXRoIG1vc3QgZmlyZXMgaW4gcGVyIFN0YXRlIDIwMTAtMjAxNSIpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKYGBgCgoKKipUaGUgYWJvdmUgcGxvdHMgYXJlIHF1aXRlIGludGVyZXN0aW5nLiAgVGhlIG1vbnRocyBvZiB0aGUgeWVhciB0aGF0IGhhdmUgdGhlIG1vc3Qgc2VlbXMgdG8gd2lkZWx5IGNoYW5nZSBpbiBjZXJ0YWluIHN0YXRlLiAgTWFpbmx5IHRoZSBlYXN0IGhhbGYgb2YgdGhlIGNvdW50cnkgaGF2ZSB0aGUgbW9zdCBmaXJlcyBpbiB0aGUgU3ByaW5nIChGZWItTWF5KSBhbmQgdGhlIHdlc3Rlcm4gcGFydCBvZiB0aGUgY291bnRyeSBoYXZlIHRoZSBtb3N0IGZpcmVzIGxhdGVyIG9uIGluIFN1bW1lciBhbmQgRmFsbCAoSnVuLU9jdCkuICBUaGVyZSBhcmUgaG93ZXZlciBhIGZldyBleGNlcHRpb25zIHRoYXQgY2FuIGJlIHNlZW4gaW4gdGhlIDIwMDQtMjAwNyBhbmQgMjAwOC0yMDExIGRhdGEgVGV4YXMgaGFzIHRoZSBtb3N0IGZpcmVzIGluIEphbnVhcnkuICBGbG9yaWRhIGFsc28gbW9zdGx5IGNvbmZvcm1lZCB0byB0aGUgRWFzdC9XZXN0IHNwbGl0IHdpdGggdGhlIG1ham9yaXR5IG9mIGl0cyB3b3JzdCBtb250aHMgZm9yIGZpcmVzIHRha2luZyBwbGFjZSBpbiBNYXJjaCBvciBBcHJpbCB1cCB1bnRpbCAyMDA3LCB0aGVuIHRoZSBtb3N0IGNvbW1vbiBtb250aCBtb3ZlcyBsYXRlciBpbnRvIEp1bmUgYW5kIEp1bHkgZm9yIHRoZSByZXN0IG9mIHRoZSByZXBvcnRpbmcgcGVyaW9kIHVudGlsIDIwMTUuIFRoaXMgbWF5IGhhdmUgdG8gZHVlIHdpdGggbWFpbiBjYXVzZSBvZiBmaXJlcyBpbiBGbG9yaWRhIGNoYW5naW5nIGZyb20gcmFpbHJvYWQgdG8gbGlnaHRuaW5nIHJlbGF0ZWQgYWJvdXQgdGhlIHNhbWUgdGltZSwgYXMgd2Ugbm90ZWQgZWFybGllciBvbiB3aGVuIGxvb2tpbmcgYXQgY2F1c2F0aW9uLiAgQXMgSnVseSBpcyB0aGUgbWFpbiBtb250aCBmb3IgdHJvcGljYWwgc3Rvcm1zIGFuZCBsaWdodG5pbmcgaW4gRmxvcmlkYSB0aGlzIGlzIGEgcG9zc2libGUgY2F1c2UgZm9yIHRoZSBoaWdoZXN0IG1vbnRoIGJlY29taW5nIGxhdGVyIGluIHRoZSB5ZWFyIHRoYW4gYmVmb3JlLiAoMikqKgoKCigyKSBodHRwczovL3d3dy53ZWF0aGVyLmdvdi9tbGIvZmxfbGlnaHRuaW5nX2NsaW1vCgoK